2017-09-27 50 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'也可以工作(因为你不需要有序遍历,但是假设这些阵列没有额外的自己的道具......)