2015-04-29 7 views
14

я получаю ниже массив объектов JSON из JSPнайти значение внутри массива объекта JSON

"Titles":[       
    { 
    "Book3" : "BULLETIN 3" 
    } 
    , 
    { 
    "Book1" : "BULLETIN 1" 
    } 
    , 
    { 
    "Book2" : "BULLETIN 2" 
    }  
] 

На JS стороне, он обрабатывается, и я вижу массив с 3-х объектов. Теперь я хочу найти/идентифицировать значение при передаче строкового ключа.

См., Например, когда я передаю «Книгу2», я должен получить значение «БЮЛЛЕТЕНЬ 2». Может кто-нибудь помочь мне определить подход?

ответ

8

Попробуйте

var data = { 
 
    "Titles": [{ 
 
     "Book3": "BULLETIN 3" 
 
    }, { 
 
     "Book1": "BULLETIN 1" 
 
    }, { 
 
     "Book2": "BULLETIN 2" 
 
    }] 
 
}; 
 

 
function getValueByKey(key, data) { 
 
    var i, len = data.length; 
 
    
 
    for (i = 0; i < len; i++) { 
 
     if (data[i] && data[i].hasOwnProperty(key)) { 
 
      return data[i][key]; 
 
     } 
 
    } 
 
    
 
    return -1; 
 
} 
 

 
console.log(getValueByKey('Book2', data.Titles));

1

Давайте создадим функцию, чтобы получить объект в массиве для этого, которая принимает два аргумента: массив и ключ свойства вы хотите получить :

function getObjectInArray(arr, key) {  
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i].hasOwnProperty(key)) return arr[i][key]; 
    } 
} 

Это проходит через каждый объект, который ищет конкретный ключ.


Решение: Теперь вы могли бы сделать что-то вроде getObjectInArray(titlesJSONArray, "Book2"), и он должен вернуться «ВЕСТНИК 2».

var titlesJSONArray = [ { "Book3": "BULLETIN 3" }, ... ]; // and so on 
var book2 = getObjectInArray(titlesJSONArray, "Book2"); // => "BULLETIN 2" 
4

Наличие:

var x = [{ 
    "Book3" : "BULLETIN 3" 
}, { 
    "Book1" : "BULLETIN 1" 
}, { 
    "Book2" : "BULLETIN 2" 
}]; 

и

var key = "Book1"; 

Вы можете получить значение с помощью:

x.filter(function(value) { 
    return value.hasOwnProperty(key); // Get only elements, which have such a key 
}).shift()[key]; // Get actual value of first element with such a key 

Обратите внимание, что он будет бросать исключение, если объект Безразлично Определите такой ключ.

Кроме того, если есть больше объектов с таким ключом, это возвращает только первый. Если вам нужно получить все значения из объектов с таким ключом, вы можете сделать:

x.filter(function(value) { 
    return value.hasOwnProperty(key); // Get only elements, which have such a key 
}).map(function(value) { 
    return value[key]; // Extract the values only 
}); 

Это даст вам массив, содержащий только соответствующие значения.

Кроме того, если вы используете jQuery, вы можете использовать grep вместо filter:

jQuery.grep(x, function(value) { 
    return value.hasOwnProperty(key); 
}) /* and so on */; 
3

Для достижения этой цели, вы должны перебрать ключи элементов массива и тест, если данный ключ существует в массив, если так получить его значение:

var jsonTitles = [       
 
      { "Book3" : "BULLETIN 3" }, 
 
      { "Book1" : "BULLETIN 1" }, 
 
      { "Book2" : "BULLETIN 2" }  
 
     ] 
 

 
    function getValue(key, array) { 
 
     for (var el in array) { 
 
      if (array[el].hasOwnProperty(key)) { 
 
       return array[el][key]; 
 
      } 
 
     } 
 
    } 
 

 
alert(getValue("Book1", jsonTitles));

W e используйте element[key] где element is array[el] введите значение key.

1

Для таких манипуляций массива/коллекции в Javascript я предлагаю вам использовать библиотеку underscorejs. Он предоставляет функции, которые для меня делают все намного проще. В вашем случае:

function find_value(array, key) { 
    // find will run the provided function for every object in array 
    var obj_found = _.find(array, function(obj) { 
     // keys returns the keys inside an object 
     // so if the key of currently examined object 
     // is what we are looking for, return the obj 
     if (_.keys(obj)[0] === key) { 
      return obj; 
     } 
    }); 
    // if an object with such key was found return its value 
    if (obj_found) { 
     return obj_found[key]; 
    } else { 
     return null; 
    } 
} 

Here является рабочей скрипкой, что я предлагаю.

Смежные вопросы