2015-11-06 49 views
1
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/意外的价值观 - JS

我不明白为什么我得到一个不同的结果比我所期望的。

我期望的最终结果是一个数组,其中包含对应不同值的对象,但我所得到的是一个数组中具有重复相同值的对象...?

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 

这是为什么?

回答

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) 
} 
4

因为即使在JS变量是通过值传递的,对象的值是一个引用。

每次调用seriesArr.push(seriesObj)时,都会将相同的参考传递给seriesObj

相反,你应该在每次迭代创建一个新的对象:

seriesArr.push({ 
    meta: 'Count', 
    value: result[1][i] 
}); 
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) 
 
}