2015-11-06 50 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) 
 
}