JSON найти в JavaScript


1 Answers

Я столкнулся с этой проблемой для сложной модели с несколькими вложенными объектами. Хорошим примером того, что я искал, было бы так: Допустим, у вас есть поляроид. И эта картина затем помещается в багажник автомобиля. Автомобиль находится внутри большого ящика. Ящик находится в трюме большого корабля с множеством других ящиков. Мне пришлось искать трюм, смотреть в ящики, проверять багажник, а затем искать существующую картину меня.

Я не мог найти никаких хороших решений в Интернете, и использование .filter() работает только с массивами. Большинство решений предложили просто проверить, существует ли model["yourpicture"] . Это было очень нежелательно, потому что, например, это только обыскало трюм корабля, и мне нужен был способ получить их дальше от кроличьей дыры.

Это рекурсивное решение, которое я сделал. В комментариях я подтвердил от TJ Crowder, что потребуется рекурсивная версия. Я думал, что поделюсь им, если кто-нибудь столкнется с подобной сложной ситуацией.

function ContainsKeyValue( obj, key, value ){
    if( obj[key] === value ) return true;
    for( all in obj )
    {
        if( obj[all] != null && obj[all][key] === value ){
            return true;
        }
        if( typeof obj[all] == "object" && obj[all]!= null ){
            var found = ContainsKeyValue( obj[all], key, value );
            if( found == true ) return true;
        }
    }
    return false;
}

Это будет начинаться с заданного объекта внутри графа и перезаписывать любые найденные объекты. Я использую его так:

var liveData = [];
for( var items in viewmodel.Crates )
{
    if( ContainsKeyValue( viewmodel.Crates[items], "PictureId", 6 ) === true )
    {
        liveData.push( viewmodel.Crates[items] );
    }
}

Который приведет к созданию массива ящиков, содержащих мою картину.

Question

Есть ли лучший способ, кроме цикла, найти данные в JSON ? Это для редактирования и удаления.

for(var k in objJsonResp) {
  if (objJsonResp[k].txtId == id) {
    if (action == 'delete') {
      objJsonResp.splice(k,1);
    } else {
      objJsonResp[k] = newVal;
    }
    break;
  }
}

Данные упорядочены как список карт. Подобно:

[
  {id:value, pId:value, cId:value,...},
  {id:value, pId:value, cId:value,...},
  ...
]



Если данные JSON в вашем массиве каким-то образом отсортированы, существует множество поисков, которые вы могли бы реализовать. Однако, если вы не имеете дело с большим количеством данных, то вы, вероятно, будете в порядке с операцией O (n) здесь (как и у вас). Все остальное, вероятно, будет излишним.




Related