2017-10-03 7 views
0

私は再帰的に期待される出力がプッシュオブジェクトを再帰的に

[ { a: 7200, b: 1.13, c: 0, d: 800, e: 5, f: 5, g: 1, h: 1 }, 
{ a: 86400, b: 1.12, c: 0, d: 3200, e: 8, f: 8, g: 1, h: 1 } ] 

になりそう

var base = { 
    a: 600, 
    b: 1.15, 
    c: 0, 
    d: 200, 
    e: 3, 
    f: 3, 
    g: 1, 
    h: 1, 
} 
var array2 = new Array(); 
for(var i=1;i<=3;i++){ 
    base.a = base.a*12 
    base.b = base.b-0.01 
    base.d = base.d*4 
    base.e = Math.ceil(base.e * 1.5) 
    base.f = base.e 
    array2.push(base) 
} 

実際は

で修正するなど、配列にプッシュする必要が午前テンプレートオブジェクトを持っています
[ { a: 86400, b: 1.11, c: 0, d: 3200, e: 8, f: 8, g: 1, h: 1 }, 
    { a: 86400, b: 1.11, c: 0, d: 3200, e: 8, f: 8, g: 1, h: 1 } ] 

私はオブジェクトを操作すると、オブジェクトの値を再帰的に変更することがわかりました。オブジェクトが配列に配置されるたびに

基本的なテンプレートを再帰的に更新するときに、遡ってすべての値を変更しないように、新しいオブジェクトをこの配列に配置するにはどうすればよいですか。

あなたは元のオブジェクトの値を変異さ

答えて

1

(期待出力で0.01 [1] .Bを誤った値を編集します)。値を計算し、配列にプッシュする前のオブジェクトを追跡する必要があります。

var base = { 
 
    a: 600, 
 
    b: 1.15, 
 
    c: 0, 
 
    d: 200, 
 
    e: 3, 
 
    f: 3, 
 
    g: 1, 
 
    h: 1, 
 
} 
 
var array2 = []; 
 
// store the reference of the original object 
 
var prev = base; 
 

 
for (var i = 1; i <= 3; i++) { 
 
    var obj = {}; 
 
    // populate the data for the new object 
 
    // based on the previous object in array 
 
    obj.a = prev.a * 12; 
 
    obj.b = prev.b - 0.01; 
 
    obj.c = prev.c; 
 
    obj.d = prev.d * 4; 
 
    obj.e = Math.ceil(prev.e * 1.5); 
 
    obj.f = prev.e; 
 
    obj.g = prev.g; 
 
    obj.h = prev.h; 
 

 
    array2.push(obj); 
 
    
 
    // save the reference of the current object state 
 
    // to be used in the next iteration 
 
    prev = obj; 
 
} 
 

 
console.log(array2);

0

あなたは、オブジェクトを1つだけ持っていて、その配列内の同じオブジェクトを推進しています。この変数ベースを、その配列に格納されているオブジェクトへのポインタと考えてください。そのため、最後の変更が配列のすべての要素に表示されます。

ベースオブジェクトの深いコピーが配列にプッシュされる前に必要です。

use lodash cloneDeepディープコピー用。

Object assignこれも実行するのに役立ちますが、これを使用する前にディープクローンの警告を必ずお読みください。

0

Sushanth's answerに拡張するには、いくつか選択肢があります。

代わりbaseオブジェクトの(1)base機能:

function getBase() { 
    return { 
    a: 600, 
    b: 1.15, 
    c: 0, 
    d: 200, 
    e: 3, 
    f: 3, 
    g: 1, 
    h: 1, 
    }; 
} 

var array2 = []; // You should use array literals instead of `new Array` 
for(var i=1;i<=3;i++){ 
    var base = getBase(); 

    base.a = base.a*12 
    base.b = base.b-0.01 
    base.d = base.d*4 
    base.e = Math.ceil(base.e * 1.5) 
    base.f = base.e 
    array2.push(base) 
} 

(2)Object.assign - あなたはノード4 +(またはIE11以下をサポートしていない、少なくともブラウザ環境)にしている場合は、これを使用してフラットオブジェクト(ネストされたプロパティなし)をコピーできます。 Neeraj Sharma's answerは、ネストされたプロパティがある場合に対処します。

var _base = { 
    a: 600, 
    b: 1.15, 
    c: 0, 
    d: 200, 
    e: 3, 
    f: 3, 
    g: 1, 
    h: 1, 
}; 

var array2 = []; // You should use array literals instead of `new Array` 
for(var i=1;i<=3;i++){ 
    var base = Object.assign({}, _base); 

    base.a = base.a*12 
    base.b = base.b-0.01 
    base.d = base.d*4 
    base.e = Math.ceil(base.e * 1.5) 
    base.f = base.e 
    array2.push(base) 
}