Почему переменная obj должна быть определена внутри для l oop против внешней? - PullRequest
1 голос
/ 27 апреля 2020

Если я определяю переменную obj внутри внешней for l oop, она не перезаписывает данные первых итераций, но когда я определяю переменную obj вне for l oop, она перезаписывает данные первых итераций с данными вторых итераций. Может кто-нибудь, пожалуйста, помогите мне понять, почему?

Кроме того, я знаю, что есть другие способы решить эту проблему с помощью map () и lower (), но я должен решить ее следующим образом.

function transformEmployeeData(arr) {
let newArr = []
**let obj = {}**
for (let i = 0; i < arr.length; i++) {
    **let obj = {}**
    for (let j = 0; j < arr[i].length; j++) {
        obj[arr[i][j][0]] = arr[i][j][1]
    }
    newArr.push(obj)
}
    return newArr
}

var input = [
[
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
],
[
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
]
];

console.log(transformEmployeeData(input)) 

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Здесь происходит несколько вещей. Самая большая проблема в том, что вы помещаете sh obj на newArr, и если вы объявляете obj только один раз, то это просто ссылка на этот объект, который перемещается. Поэтому, когда вы делаете sh во второй раз, у вас есть 2 ссылки на один объект .

По той же причине, когда ваши значения изменяются на для второй записи во входном файле она перезаписывает значения в obj данными Мэри Дженкинс, но они изменяются в один объект и, следовательно, изменяются как в newArr[0], так и newArr[1], так как они оба указывают к тому же объекту.

Объявляя obj внутри l oop, вы будете помещать 2 различных объекта в массив newArr и получать то, что вы хотите.

0 голосов
/ 27 апреля 2020

Объекты являются ссылками.

var objectCollection = [];
var o = {}

o.foo = 1;
objectCollection.push(o);

o.foo = 2;
objectCollection.push(o);


console.log(objectCollection)    //All 2 elemets are the same object

objectCollection[0].foo = 100;
console.log(objectCollection);

Что вы ожидаете в массиве выше? Каждый элемент ссылается на один и тот же объект - и если этот объект изменяется, везде, где этот объект упоминается, - также будет изменяться.

Давайте go вернемся к вашему вопросу

Когда вы объявляете свой объект вне обоих циклов, то, что вы помещаете sh в массив, каждый раз является одним и тем же объектом. Если вы объявляете это только внутри внешнего l oop, новый объект создается для внутреннего l oop для обработки каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...