(Вы ищете не через "JSON", вы ищете через массив - строка JSON уже десериализована в граф объектов, в данном случае массив.)
Некоторые опции:
Использование объекта вместо массива
Если вы контролируете генерацию этой вещи, имеет ли значение для массива? Потому что если нет, то есть гораздо более простой способ.
Скажите, что это ваши исходные данные:
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
Не могли бы вы сделать следующее вместо этого?
{
"one": {"pId": "foo1", "cId": "bar1"},
"two": {"pId": "foo2", "cId": "bar2"},
"three": {"pId": "foo3", "cId": "bar3"}
}
Тогда поиск соответствующей записи по ID тривиален:
id = "one"; // Or whatever
var entry = objJsonResp[id];
... как обновляет его:
objJsonResp[id] = /* New value */;
... и удаление его:
delete objJsonResp[id];
Это использует тот факт, что в JavaScript вы можете индексировать в объект, используя имя свойства в качестве строки - и эта строка может быть литералом, или она может быть из переменной, как в id
выше.
Вставка карты ID-в-индекс
(Тупая идея, предшествующая вышесказанному. Сохраняется по историческим причинам.)
Похоже, вам нужно, чтобы это был массив, и в этом случае на самом деле нет лучшего способа, чем поиск по массиву, если вы не хотите поместить на него карту, что вы могли бы сделать, если у вас есть контроль над генерация объекта. Например, скажем, у вас есть это изначально:
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
Генерирующий код может предоставить карту id-to-index:
{
"index": {
"one": 0, "two": 1, "three": 2
},
"data": [
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
}
Тогда получение записи для идентификатора в переменной id
тривиально:
var index = objJsonResp.index[id];
var obj = objJsonResp.data[index];
Это использует тот факт, что вы можете индексировать объекты, используя имена свойств.
Конечно, если вы это сделаете, вам придется обновлять карту при изменении массива, что может стать проблемой обслуживания.
Но если вы не контролируете генерацию объекта или обновление карты ids-to-indexes - это слишком много кода и / или проблемы с обслуживанием, то вам придется выполнить поиск методом перебора.
Поиск грубой силы (исправлено)
Отчасти OT (хотя вы спрашивали, был ли лучший способ :-)), но ваш код для циклического перемещения по массиву неверен. Подробности здесь , но вы не можете использовать for..in
для циклического перемещения по индексам массива (или, скорее, если вы это сделаете, вы должны приложить особые усилия для этого); for..in
перебирает свойства объекта , а не индексов массива . Ваша лучшая ставка с не разреженным массивом (а ваш не разреженным) - это стандартный старомодный цикл:
var k;
for (k = 0; k < someArray.length; ++k) { /* ... */ }
или
var k;
for (k = someArray.length - 1; k >= 0; --k) { /* ... */ }
Какой бы вы ни предпочли (последний не всегда быстрее во всех реализациях, что для меня нелогично, но мы здесь). (С массивом разреженным вы можете использовать for..in
, но опять же прилагайте особые усилия, чтобы избежать ловушек; подробнее в статье, приведенной выше.)
Использование for..in
в массиве , кажется, работает в простых случаях, поскольку массивы имеют свойства для каждого из своих индексов, а их единственные другие свойства по умолчанию (length
и их методы) помечены как не -enumerable. Но он ломается, как только вы устанавливаете (или задаете фреймворк) любые другие свойства объекта массива (что вполне допустимо; массивы - это просто объекты с небольшой специальной обработкой вокруг свойства length
).