2016-10-09 2 views
0

У меня есть функция, которая принимает список словарей [{}] в качестве аргумента. Он управляет этим списком dicts, добавляя к нему новую пару key: value, где значение снова является списком словарей. Вот как выглядит функция, я добавил комментарии, чтобы объяснить это.Javascript: Значение словаря «ключ» становится равным нулю для цикла

function addFilesToProjects(nonUniqueArray, lists) { 
    var fileList = [{}]; //this will contain the list of dictionaries that I want to add as a key to the array 'nonUniqueArray' 
    var filesArray = []; //this was just for testing purposes because I want to access the modified version of nonUniqueArray outside the function, which I'm not able to (it shows undefined for the new key:value pair) 
    for (var i = 0; i < nonUniqueArray.length; i++) { 
     lists.forEach(function (list) { 
      fileNameString = JSON.stringify(list['name']).slice(2, -2); 
      if (fileNameString.indexOf(nonUniqueArray[i]['title']) !== -1 && fileNameString !== nonUniqueArray[i]['title']) { 
       fileList.push({ 
        'name': fileNameString 
       }); 
      } 
     }); 
     nonUniqueArray[i]['files'] = fileList; 

     //this logs out the right key:value pair to the console 
     console.log(nonUniqueArray[i]); 

     filesArray.push(nonUniqueArray[i]); 
     while (fileList.length > 0) { 
      fileList.pop(); 
     } 
    } 

    //however, now I get everything as before except the new 'files' key has empty list [] as its value :( 
    console.log(nonUniqueArray); 

    return filesArray; 
} 

У меня нет подсказки, почему это происходит, может кто-то помочь?

+0

Пройдите код с полнофункциональным отладчиком, встроенным в вашу среду IDE или браузер. Это лучший способ узнать, что происходит и что происходит. –

+0

'теперь я получаю все, как и раньше, кроме того, что новый ключ« файлов »имеет пустой список». Ну, разве вы не опорожняете его даже пятью строками выше? – vlaz

+0

Я вывожу все из массива filesArray, а не unUniqueArray. Кроме того, это на стороне сервера, и я кодирую на возвышенном. Я отлаживаю использование console.logs, но это не помогает мне – Scrotch

ответ

3

Вы, кажется, думаете, что вы добавляете копию из fileList в каждом словаре, но на самом деле добавление жеfileList в каждый (то есть, каждый из них является ссылкой на тот же объект), так что, как указывает @vlaz, когда вы очищаете оригинал, вы фактически освобождаете то, что появляется в каждом словаре.

+0

ОК, это дает мне некоторую уверенность - это то, что я думал, произошло сначала, но потом, когда я попытался проследить его обратно через код, я смутился. – vlaz

+0

Ах, это имеет смысл. Каков обходной путь для этого? После каждой итерации я должен сделать список пустым, иначе он добавит то, что в настоящее время имеет + данные, которые он получает на следующей итерации. – Scrotch

+0

@ user3728233 «Обходной путь» - это копирование массива, вызывающего 'arr.slice (0)'. Правильное решение будет состоять в том, чтобы перезаписать эту функцию, поскольку я все еще ее читаю, и я до сих пор не знаю, что она делает, помимо перемещения материала из множества массивов. Это кажется излишне сложным. – vlaz

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