Найти значение внутри массива объекта JSON

Я получаю под массивом объектов JSON из JSP

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

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

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

Ответы

Ответ 1

Попробуйте это

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));

Ответ 2

Наличие:

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));

Ответ 4

Для таких манипуляций массива/коллекции в 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;
   }
}

Здесь - рабочая скрипка того, что я предлагаю.

Ответ 5

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

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"