2016-05-24 5 views
0

У меня есть данные, что выглядит следующим образом:Лучший способ Фильтр ключей

var data = [ 
    {item1: 123, item2: "name", item3: "id"}, 
    {item1: 234, item2: "other"}, 
    {item1: 456, item2: "another"}, 
    {item1: 789, item2: "again"} 
] 

Как я Переберите и найти, если item3 есть, и если это не так, заполнить его с чем-то.

+1

Что вы пытаетесь до сих пор? – henrikstroem

+0

Я пытался использовать, если «item» == undefined, но он, похоже, не работает @henrikstroem –

ответ

2

Вы можете использовать обычный цикл для итерации по элементам массива или следовать за functionalapproach.

var data = [ 
 
    {item1: 123, item2: "name", item3: "id"}, 
 
    {item1: 234, item2: "other"}, 
 
    {item1: 456, item2: "another"}, 
 
    {item1: 789, item2: "again"} 
 
]; 
 

 
// 1. Using Array.foreach: 
 
data.forEach(function(element) { 
 
    if (!element.hasOwnProperty('item3')) element.item3 = "default"; 
 
}); 
 

 
// 2. Using Array.map: 
 
data = data.map(function(element) { 
 
    if (!element.hasOwnProperty('item3')) element.item3 = "default"; 
 
    return element; 
 
}); 
 

 
// 3. Using a for-loop: 
 
for (var i = 0, length = data.length; i < length; ++i) { 
 
    if (!data[i].hasOwnProperty('item3')) data[i].item3 = "default"; 
 
} 
 

 
console.log(data);

Я рекомендую 1 или 2, если вы не хотите, чтобы сохранить исходный массив данных.

Производительность на Chrome 48 (аналогичные в Firefox 44, 100000 работает):

  • Array.foreach() 520ms
  • Array.map() 790ms
  • для цикла 2700ms

Возможное объяснение: поскольку обратные вызовы Array.foreach() и Array.map() не ссылаются ни на что за пределами переданных параметров, современные JIT могут кэшировать прошедшие встроенные и превосходит традиционную для цикла.

+0

Мне жаль, что я не мог получить доступ к jsPerf, чтобы увидеть производительность ... – IMTheNachoMan

+0

Слишком плохо, пока что нет./ –

0
for(var elem in data){ 
    var isPresent = 0; 
    for(var key in data[elem]){ 
     if(key == "item3"){ 
      isPresent = 1; 
     } 
    } 
    if(!isPresent){ 
     //Whatever function you need 
    } 

Это должно быть так.

+0

Где вы получили «полезную нагрузку»? – IMTheNachoMan

+0

Извините, это была функция, которую я ранее создал. Я починил это. @IMTheNachoMan –

+0

Вы еще никогда не создаете ключ, если его нет. – IMTheNachoMan

1
data.forEach(function (item) { 
    if (item.item3 == undefined) item.item3 = "filled with something" 
}); 
+1

Что делать, если' item.item3' фальшиво? – noisypixy

+2

'typeof item.item3 === 'undefined'' – Russbear

+0

Достаточно честный, я его обновлю, но требования были немного разрежены – mdickin

1

Вы можете использовать цикл for для итерации по каждому элементу в порядке, в массиве.

for(var i = 0; i < data.length; i++) { 
    //check to see if item3 is NOT there 
    if(typeof data[i].item3 === 'undefined') { 
     data[i].item3 = 'default value'; 
    } 
} 
+0

Что делать, если' data [i] .item3' '' false'? – IMTheNachoMan

1

Используйте простой for...of цикл:

for (const element of data) { 
    if (!("item3" in element)) { 
    element.item3 = "something" 
    } 
} 
1

перебирать и проверить, если ключ существует.

var data = [ 
    { item1: 123, item2: "name", item3: "id" }, 
    { item1: 234, item2: "other" }, 
    { item1: 456, item2: "another" }, 
    { item1: 789, item2: "again" } 
] 

function fillIn(data, key, value) 
{ 
    for(var i = 0, numRows = data.length; i < numRows; ++i) 
    { 
     if(!(key in data[i])) data[i][key] = value; 
    } 
} 

fillIn(data, "item3", "dingo"); 
1

Попробуйте следующий цикл:

 for (var i = 0; i < data.length; i++){ 
      for (var item in data[i]){ 
      if (item == "item3"){ 
       console.log("found"); 
      } 
      } 
     } 
0

В то время как спецификация для фильтрации объектов без item3, я предлагаю использовать Array#filter.

var data = [{ item1: 123, item2: "name", item3: "id" }, { item1: 234, item2: "other" }, { item1: 456, item2: "another" }, { item1: 789, item2: "again" }], 
 
    dataWithoutItem3 = data.filter(function (o) { 
 
     return !('item3' in o); 
 
    }); 
 

 
document.write('<pre>' + JSON.stringify(dataWithoutItem3, 0, 4) + '</pre>');

0

Это, как вы это делаете;

var data = [ 
 
    {item1: 123, item2: "name", item3: "id"}, 
 
    {item1: 234, item2: "other"}, 
 
    {item1: 456, item2: "another"}, 
 
    {item1: 789, item2: "again"} 
 
], 
 
newData = data.map(o => !o.item3 ? (o.item3 = "something",o) : o); 
 

 
console.log(newData);

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