2014-01-04 3 views
0

У меня этот код у друга (ссылка на скрипку ниже). Проблема, которую я пытаюсь выяснить, заключается в том, что массив (arr1, который представляет собой массив объектов) автоматически объединяет атрибут суммы для объекта с индексом 0 с объектом в индексе 2, как показано в журнале консоли. Однако, если я остановлю вызов функции addByPayCodeAndLaborAcc(), комментируя это, тогда он регистрирует обычный массив, как и должно быть. Пожалуйста, помогите, почему это происходит. Возможно, из-за подъема.Массив объектов в javascript автоматически объединяет атрибуты

Вот скрипка. http://jsfiddle.net/3ZQNg/

console.log, что я вижу

[Object, Object, Object, Object] 
0: Object 
amount: "0414:54:32" 
laboracc: "1" 
pcname: "a" 
__proto__: Object 
1: Object 
2: Object 
amount: "14:54:32" 
laboracc: "1" 
pcname: "a" 
__proto__: Object 
3: Object 
length: 4 

Однако массив, что у меня есть в коде

arr1 = [ 
    { 
     pcname : "a", 
     laboracc : "1", 
     amount : "04" 
    },  
    { 
     pcname : "b", 
     laboracc : "1", 
     amount : "777" 
    }, 
    { 
     pcname : "a", 
     laboracc : "1", 
     amount : "14:54:32", 
    }, 
    { 
     pcname : "c", 
     laboracc : "2", 
     amount : "23" 
    }]; 

Почему сумма атрибута получение добавляется для объекта с индексом 0 с объектом объекта с индексом 2 автоматически?

РЕШЕНИЕ: Я выяснил причину. Когда объекты копируются, они копируются по ссылке. Это тот же объект остается в куче, и копируется только его ссылка, в отличие от первичных типов переменных, таких как Number или String, которые копируются по значению (т.е. создается новая копия). Изначально uiqueRows - []. Первый объект в массиве selectedTotals (с именем paname a) затем копируется в uniqueRows (скопирован по ссылке - таким образом, uniqueRows [0] теперь совпадает с выбраннымиTotals [0]). Затем мы добавляем второй объект к uniqueRows. Когда мы переходим к третьему объекту с тем же именем «a», итоговый объект получает значение uniqueRows [0] (что совпадает с выбранными значениями [0]). Таким образом, когда summary.amount обновляется, атрибут amount selectedRows [0] обновляется (потому что они относятся к одному и тому же объекту в куче). Таким образом, добавленное значение отражается в журнале.

Пожалуйста, обратитесь к console.logs в обновленной скрипке. Журналы показывают, что возвращаемый объект как «резюме» такой же, как selectedTotals [0], следовательно, «истина» печатается в журнале http://jsfiddle.net/3ZQNg/1/

ответ

0

В Chrome Дев инструментов, все объекты, кажется, вернуть правильную позицию индекса:

start (index):127 
Array[4] 
0: Object 
1: Object 
2: Object 
3: Object 
length: 4 
__proto__: Array[0] 
+0

Я знаю, что объекты находятся в правильном положении индекса. Пожалуйста, обратитесь к моему редактированию в вопросе о реальной проблеме. –

1

addByPayCodeAndLaborAcc считается первым "a" Элемент представляет собой резюме второго. Он устанавливает поле amount первого "a" элементам в какую-то странную вещь, вычисленную с помощью getAmountInTimeOrCurrency, которая в конечном итоге объединяет суммы. Я не уверен почему ваш код делает это, но так вы его написали.

+0

спасибо за подсказку. Я понял реальную причину. Проверьте мои изменения. –

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