2015-02-20 3 views
2

Пожалуйста, взгляните на приведенный ниже код.Использование для цикла внутри массива forEach

У меня есть основной массив: NOP и массив TEMP: tempArray

Если массив tempArray содержит элементы, которые находятся в главном NOP массива, затем отметьте его isSelect как истинный.

Однако, если вы запустите код, приведенный ниже, вы увидите только последний элемент tempArray как был изменен на основной массив NOP ....

var nop = [ 
    {title:'blue', isSelect: false }, 
    {title:'red', isSelect: true }, 
    {title:'yellow', isSelect: false }, 
    {title:'black', isSelect: false }, 
    {title:'dark blue', isSelect: false }, 
    {title:'reddish', isSelect: false }, 
    {title:'hello', isSelect: false }, 
    {title:'help', isSelect: false }, 
    {title:'me', isSelect: false } 
]; 

var tempArray = ["blue", "hello", "help"]; 

tempArray.forEach(function(value){ 
       var index; 
       for (index = 0; index < nop.length; ++index) { 
        if (nop[index].title === value){ 
         nop[index].isSelect = true; 
         console.log('FOR LOOP = TRUE for: ' + value); 
        } 
        else { 
         nop[index].isSelect = false; 
        } 
       } 
      }); 

console.log(JSON.stringify(nop)); 

Приведенные выше результаты в:

FOR LOOP = TRUE for: blue 
FOR LOOP = TRUE for: hello 
FOR LOOP = TRUE for: help 
[{"title":"blue","isSelect":false},{"title":"red","isSelect":false},{"title":"yellow","isSelect":false},{"title":"black","isSelect":false},{"title":"dark blue","isSelect":false},{"title":"reddish","isSelect":false},{"title":"hello","isSelect":false},{"title":"help","isSelect":true},{"title":"me","isSelect":false}] 

только этот элемент был обновлен: {"title":"help","isSelect":true}

Я хочу, чтобы получить все 3 элемента обновлено:

{"title":"blue","isSelect":true} 
{"title":"yellow","isSelect":true} 
{"title":"help","isSelect":true} 

Что я делаю неправильно?

спасибо.

ответ

0

Для каждого цвета переопределения предыдущего результата из-за «другой» установить их все ложную первую затем петлю и установите те, которые вы хотите истинный

 tempArray.forEach(function(value){ 
      var index; 
      for (index = 0; index < nop.length; index++) { 
       if (nop[index].title === value){ 
        nop[index].isSelect = true; 
        console.log('FOR LOOP = TRUE for: ' + value); 
       } 

      } 
     }); 

Js скрипка - http://jsfiddle.net/rxq529s4/

+0

У каждого был правильный ответ, но небольшое объяснение помогло мне понять. Спасибо. – UTN

+0

Я не думаю, что для этого вам нужны вложенные циклы. Проверьте мой ответ один раз. – void

1

Просто удалите else состояние

tempArray.forEach(function(value){ 
       var index; 
       for (index = 0; index < nop.length; ++index) { 
        if (nop[index].title === value){ 
         nop[index].isSelect = true; 
         console.log('FOR LOOP = TRUE for: ' + value); 
        } 

       } 
      }); 

Рабочая Fiddle

EDIT

for (index = 0; index < nop.length; ++index) 
       if (tempArray.indexOf(nop[index].title)) 
         nop[index].isSelect = true; 

console.log(JSON.stringify(nop)); 
+0

См. Обновленный ответ. Более короткий путь. @UTN – void

0

В то время как цикл с forEach второй цикл стирает изменения по сравнению с первой, как ваш еще комплект isSelect - false, если заголовок не является текущим значением.

Вы должны проверить, соответствует ли isSelected значение true в вашем блоке и пропустить заголовок равным значению.

0

Вы делаете непревзойденную ложную часть. Таким образом, только последний обновляется, а затем не изменяется. Удалите часть else.

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