gpt4 book ai didi

javascript - 数组到对象 : declaring object inside vs outside for loop. 不同的结果

转载 作者:行者123 更新时间:2023-11-29 21:11:39 25 4
gpt4 key购买 nike

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

var employees = [];
var person = {};

function transformEmployeeData(employeeData){
for(i=0; i < employeeData.length; i++){
for(j=0; j < employeeData[i].length; j++){
var key = employeeData[i][j][0];
var value = employeeData[i][j][1];
person[key] = value;
employees[i] = person;
}
}
return employees;
}
console.log(transformEmployeeData(eData));

返回以下内容:

[ { firstName: 'Mary',
lastName: 'Jenkins',
age: 36,
role: 'manager' },
{ firstName: 'Mary',
lastName: 'Jenkins',
age: 36,
role: 'manager' } ]

为什么 Mary 是 employees[0] 和 employees[1]?

在第一个 for 循环中声明 person 对象解决了这个问题。但是为什么?

为什么将 person 对象放在第二个 for 循环中:

function transformEmployeeData(employeeData){
for(i=0; i < employeeData.length; i++){
for(j=0; j < employeeData[i].length; j++){
var person = {};
var key = employeeData[i][j][0];
var value = employeeData[i][j][1];
person[key] = value;
employees[i] = person;
}
}
return employees;
}

只返回以下内容?

[ { role: 'clerk' }, { role: 'manager' } ]

最佳答案

当您在第一个示例中在全局范围内声明 person 时,您正在定义一个对脚本中所有代码可见的对象。您的循环基本上只是在内部循环的每次迭代中改变这个变量的一个属性。它每次都是相同的变量,只是分配了不同的值——并且数组 employees 中的每一项都指向这个对象。

在第二个例子中,var person 是在 for block 中声明的——它不存在于这个 block 之外。此外,var 在声明它的循环的每次迭代中都被重新声明为一个新的、不同的变量

在第二种情况下,Javascript 足够聪明,即使在 person 本身被垃圾回收后,它也可以保留分配给 person 变量的对象。

这些是 Javascript 范围内的基本概念。您可能会在 MDN article on var 中找到一些关于 Javascript 范围的信息讨论。 .

编辑:关于我忽略的东西的附加信息:

您还需要注意 declere person 的位置以及在循环中分配的内容。 如果您在最内层循环中声明 person,它会被反复销毁然后再次实例化,一次只保留一个属性:

当 j=0 时,它创建 person={firstname:"Mary"},它被分配给 employees[i] 然后被销毁

当 j=1 时,它创建 person={lastname:"Jenkins},它被分配给 employees[i] 然后被销毁

当 j=2 时,它创建 person={age:36},它被分配给 employees[i] 然后被销毁

当 j=3 时,它创建 person={role:"manager"},它被分配给 employees[i] 然后被销毁

然后它退出内部循环,employees[i] 保留最后的分配。

关于javascript - 数组到对象 : declaring object inside vs outside for loop. 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com