Javascript - получить значение свойства в конкретном элементе массива JSON по его ключу - PullRequest
5 голосов
/ 05 мая 2011

У меня есть такая структура JSON:

{
map: [
      {"key1":"valueA1", "key2":"valueA2", "key3":"valueA3"},
      {"key1":"valueB1", "key2":"valueB2", "key3":"valueB3"},
      {"key1":"valueC1", "key2":"valueC2", "key3":"valueC3"},
       .... etc
     ]
}

... которую я загружаю в свое приложение javascript, чтобы стать объектом через JSON.parse ().

Я хочуполучить (скажем) значение key3 из элемента массива объектов, где key2 = 'valueB2'.

Я могу сделать это, просматривая цикл, но задавался вопросом, была ли более элегантная (например, одна строка и болееэффективный) способ сделать это, без необходимости знать номер индекса для элемента массива?

У меня есть множество сайтов Google, но безрезультатно.Или мне лучше упростить / убрать массив в пользу простого списка объектов?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

JSON обычно будет иметь двойные кавычки "вокруг всех ключей и значений, кроме чисел.

Однако цикл - самый эффективный и лучший выбор, который у вас есть. Существуют новые методы итерации функциональных массивов, но они доступны только в новых движках и браузерах JS, их можно найти здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

Если вы можете изменять структуру JSON, вы должны реализовать ее как Object, а не как массив объектов, где ключ - это значение key2, а значение - Object.

Пример:

{
    "valueB2": {
        "key1": "valueB1",
        "key2": "valueB2",
        "key3": "valueB3"
    }
}

Для извлечения объекта будет O (1) и просто obj["valueB2"]

1 голос
/ 05 мая 2011

Нет более элегантного способа сделать это.Единственное, что вы знаете без циклов - это индексы.Это не тот идентификатор, который вам нужен, поэтому вам придется проверить содержимое: loop:

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

или что-то в этом роде.

0 голосов
/ 07 мая 2011

Подводя итог: взяв идеи из обоих ответов, я принял эту более простую структуру JSON:

[
    {"key1":"valueA1", "key2":"valueA2", "key3":"valueA3"},
    {"key1":"valueB1", "key2":"valueB2", "key3":"valueB3"},
    {"key1":"valueC1", "key2":"valueC2", "key3":"valueC3"},
    .... etc
]

с предложенной функцией цикла, чтобы найти элемент для "key2:" valueB2 "- к массиву доступ осуществляется по индексу в большинстве случаев, и только изредка при циклическом поиске, так что это казалось наилучшим балансом понял, что могу покончить с содержащим объектом «картой», так как он не добавляет никакой утилиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...