2017-09-27 52 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

「更好」是非常主觀的。我目前的解決方案沒有看到任何問題。 – 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

爲前提,您的當前碼是完全確定, 上ES6,(可能更快和更可讀的)變體可以是

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

on es < 6,'for in'也可以工作(因爲你不需要有序遍歷,但是假設這些陣列沒有額外的自己的道具......)