2017-08-29 7 views
0

私は以下のことに助けが必要です。 配列を複製し、値を更新して新しいオブジェクトに挿入する必要があります。オブジェクト内に配列を複製し、キーに基づいて値を更新する - JavaScript

私のコード今:

// Sample test values {name:'The initial value', altName:'a first Name;a second name'} 

var allAltName = test.altName;//Test come from a forEach() Iteration 

     if (test.altName) {//First I check if ther is my parama altName 
      var b, 
       countAllAltName = allAltName.split(';'); //Here I split my parameter string based on ';' 

      if (countAllAltName.length > 0) { 
       for (b = 0; b < countAllAltName.length; b = b + 1) { 
        var originalName = {};//I create a new object 
        originalName = test;//I load my existing object into a blank object 

        if (!ret["Index"]) // I check if my final object Key exist 
         ret["Index"] = {}; // if not create new object 
        if (!ret["Index"]["Index"]) // check another key 
         ret["Index"]["Index"] = []; // if not create new 
        originalName.name = countAllAltName[b];//Update my new object originalName with new value 

        ret["Index"]["Index"].push(originalName); // push current element in the designated list 

        ret["Index"]["Index"].sort(function (a, b) { 
         return a.name.localeCompare(b.name); 
        }); 
        console.log(ret); 
       } 
      } 
     } 

問題はretで必要なオブジェクト・キーが含まれますが、各ARAYでnameのすべての値は、(私がCONSOLE.LOG altName の同じ最後の値を持つ)各ステップでoriginalNameの値は何時も良いと思います。 最終結果が失敗した理由、およびデータを上書きする理由。

+0

生データと必要な結果を追加してください。 –

答えて

1

originalName = testと書くと、originalNameはテストのエイリアス(両方とも同じ参照を共有している)であることがJSに伝えられます。

この動作はoriginaleNameで変更されたもので、テストで影響を受け、その逆もあります(動作はArrayとObjectの場合のみtrue)。

あなたは本当のコピーを行いたい場合は、(制限付きで)最も簡単な方法は次のとおりです。

originalName = JSON.parse(JSON.stringify(test)); 

最終のもの:var originalName = {}は、Arrayが、オブジェクトではありません。いくつかの重要な違いがあります

+0

ありがとう@fefux私は、配列とオブジェクトの名義に関する間違いを修正しました。あなたの答えは素晴らしく、エイリアスについて新しいことを学びます。変数に値を代入するときは、最初は等号がコピーを作成したと思っていました。 – Benoit