2015-11-06 2 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

Я не могу понять, почему я получаю другой результат, чем то, что я ожидал.

Ожидаемый конечный результат - это объект, содержащий объекты Array с соответствующими разными значениями, но все, что я получаю, это объекты в массиве с повторяющимися значениями ...?

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

Один способ исправить это, чтобы объявить объект внутри для цикла:

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

Смежные вопросы