2016-10-09 8 views
0

辞書のリストを引数として取る関数があります。[{}]これは新しいkey: valueのペアを追加することでこの辞書のリストを操作します。ここでvalueは辞書のリストです。これは関数の外観です。私はそれを説明するコメントを追加しました。Javascript:辞書 'key'の値がループの外側でヌルになる

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配列のすべてをポップしていますが、非ユニーク配列ではありません。また、これはサーバー側にあり、私は崇高な上でコーディングしています。私はconsole.logsを使用してデバッグしていますが、それは私を助けていません – Scrotch

答えて

3

はあなたが各辞書にfileListコピーを追加することを考えているようだが、実際にはそれぞれに同じfileListを追加しているように(つまり、それぞれが同じオブジェクトへの参照です)、 @vlazが指摘しているように、オリジナルを空にすると、実際には各辞書に表示されているものが空になります。

+0

これは私にある程度の安心感を与えてくれました。私が最初に起こったと思ったことですが、コードを遡ってみると、混乱しました。 – vlaz

+0

ああ、意味があります。これの回避策は何ですか?すべての反復の後、私はリストを空にする必要があります。それ以外の場合は、現在のものと次の反復で取得するデータを追加します。 – Scrotch

+0

@ user3728233 "回避策"は、 'arr.slice(0)'を呼び出す配列のコピーを取得することです。適切な解決策は、私がまだそれを読んでいるので、その関数を書き直すことです。そして、配列の束から物を動かすことを除いて、何をしているのかまだ分かりません。それは不必要に複雑なようです。 – vlaz

関連する問題