var seriesObj = {}
var result = [
['a','b'],
[14, 5, 4, 11, 23, 5, 24, 6, 34, 53, 13, 2]
]
var seriesArr = []
var i
var resultLen = result[1].length
for (i = 0; i < resultLen; i++) {
seriesObj.meta = 'Count'
seriesObj.value = result[1][i]
seriesArr.push(seriesObj)
console.log(seriesArr)
}
https://jsfiddle.net/sgbxsbz5/2/
我无法理解为什么我得到的结果与我的期望不同。
我期望的最终结果是一个数组,其中包含具有相应不同值的对象,但我得到的只是数组中的对象,其中重复的值相同...?
E.g。
0: Object
meta: "Count"
value: 2
1: Object
meta: "Count"
value: 2
但我希望
0: Object
meta: "Count"
value: 14
1: Object
meta: "Count"
value: 5
为什么?
答案 0 :(得分:4)
因为即使在JS变量中按值传递,对象的值也是一个引用。
每次调用seriesArr.push(seriesObj)
时,您都会将相同的引用传递给seriesObj
。
相反,您应该在每次迭代时创建一个新对象:
seriesArr.push({
meta: 'Count',
value: result[1][i]
});
答案 1 :(得分:1)
解决此问题的一种方法是在for循环中声明对象:
var result = [
['a','b'],
[14, 5, 4, 11, 23, 5, 24, 6, 34, 53, 13, 2]
]
var seriesArr = []
var i
var resultLen = result[1].length
for (i = 0; i < resultLen; i++) {
var seriesObj = {}
seriesObj.meta = 'Count'
seriesObj.value = result[1][i]
seriesArr.push(seriesObj)
console.log(seriesArr)
}
答案 2 :(得分:1)
您应该将 map MDN 用于此
var seriesArr = result[1].map(function(val){
return { meta: 'Count', value: val };
});
为了解释为什么你的版本没有工作......
当seriesObj被推送到seriesArr时,seriesArr会将引用获取为seriesObj 的值。变量seriesObj的值是一个对象。该对象的属性可能会更改,但变量seriesObj的值仍然是该对象。
为了将单独的对象推送到数组中,变量seriesObj的值需要更改为其他对象。
这可以通过在for循环中创建一个新对象来实现。
for (i = 0; i < resultLen; i++) {
seriesObj = {};
seriesObj.meta = 'Count'
seriesObj.value = result[1][i]
seriesArr.push(seriesObj)
console.log(seriesArr)
}