来自函数的意外值 - JS

时间:2015-11-06 20:16:29

标签: javascript arrays for-loop

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

为什么?

3 个答案:

答案 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)
 }