2017-09-27 2 views
2

多次元配列のディープ値を変更する最も効果的な方法は何ですか?Javascript:配列の深さを変更する

私はJSONを次ています

[ 
    {"name":"Series 1","data":[ 
    {"x":1506470700,"y":null}, 
    {"x":1506499200,"y":null}, 
    {"x":1506499500,"y":483981}, 
    {"x":1506499800,"y":504588}, 
    {"x":1506500100,"y":502926}, 
    {"x":1506500400,"y":501161}, 
    {"x":1506500700,"y":506453}] 
    },{"name":"Series 2","data":[ 
    {"x":1506470700,"y":null}, 
    {"x":1506499200,"y":null}, 
    {"x":1506499500,"y":-490671}, 
    {"x":1506499800,"y":-495593}, 
    {"x":1506500100,"y":-512765}, 
    {"x":1506500400,"y":-479475}, 
    {"x":1506500700,"y":-531689}] 
    } 
] 

を私は1000で、私は、たとえば、このコードを使用して、それを処理できるのxの値を乗算したいと思います:

arrayFromJson.forEach((series) => { 
    series.data.forEach((dataSet) => { 
     dataSet.x *= 1000; 
    }); 
}); 

しかし、私はどうかそこに思っていましたそれを行うにはより効果的ではない/エレガントな方法です。

+1

"better"は非常に主観的です。あなたの現在の解決策に何か間違いはありません。 – robertklep

+0

形容詞を修正しました。ありがとう – simPod

答えて

2

使用アレイマップ:

var arr = [{"name":"Series 1","data":[{"x":1506470700,"y":null},{"x":1506499200,"y":null},{"x":1506499500,"y":483981},{"x":1506499800,"y":504588},{"x":1506500100,"y":502926},{"x":1506500400,"y":501161},{"x":1506500700,"y":506453}]},{"name":"Series 2","data":[{"x":1506470700,"y":null},{"x":1506499200,"y":null},{"x":1506499500,"y":-490671},{"x":1506499800,"y":-495593},{"x":1506500100,"y":-512765},{"x":1506500400,"y":-479475},{"x":1506500700,"y":-531689}]}]; 
 

 
arr.map(it => { 
 
    it.data = it.data.map(dt => { dt.x = dt.x * 1000 ; return dt;}) 
 
}); 
 

 
console.log(arr);

+0

OPのforEachは新しい配列を生成しません。ここでのマップは必要ではないオーバーヘッドです。 – Keith

0

あなたは、いくつかの括弧と中括弧なしで、少し短く、それを書くことができます。しかし、まだネストされた反復が必要です。

arrayFromJson.forEach(series => series.data.forEach(dataSet => dataSet.x *= 1000)); 
1

解決策はまったく問題ありませんが、元の配列に変異を起こして副作用を引き起こす可能性があることに注意してください。不変のソリューションを使用Array.prototype.mapObject.assignについては

var data = [{"name":"Series 1","data":[{"x":1506470700,"y":null},{"x":1506499200,"y":null},{"x":1506499500,"y":483981}]}]; 
 

 
var changedData = data.map(series => { 
 
    return Object.assign({}, series, { 
 
     data: series.data.map(dataSet => { 
 
     return Object.assign({}, dataSet, { x: dataSet.x * 1000 }); 
 
     }) 
 
    }); 
 
}); 
 

 
console.log(data); 
 
console.log(changedData);

+0

'='の代わりに 'Object.assign'を使う理由は? – simPod

0

あなたの現在のコードが完全にOKであることを前提、ES6の 、(おそらくより速く、より読みやすい)バリアントは可能性があり

for(let series of arrayFromJson) 
    for(let data of series.data) 
    data.x *= 1000; 

オンエックス< 6、 'for for'も機能します(あなたが秩序あるトラバーサルを必要としないので、これらの配列には特別な小道具がありません)。

関連する問題