带循环的奇怪Javascript变量函数作用域

时间:2019-01-12 16:19:31

标签: javascript for-loop javascript-objects

尝试执行以下操作时,我遇到一些奇怪的行为:

  1. 创建一个基本的JSON对象
  2. 创建一个for循环并将基础对象发送到要修改的新函数
  3. 新功能应修改基本JSON对象的一个​​元素,然后将其发送回

这是我的示例代码:

var object = [
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 0},
{"test": "Test3", "id": 0},
{"test": "Test4", "id": 0},
];


for(var i=0; i < 4; i++) {
newObject(i).then(function(obj){
  console.log(obj);
  })
}

function newObject(i) {
  return new Promise(function(resolve, reject){
  var newObject = object;
  newObject[i].id = i;
    resolve(newObject);
  })
}

我期望从console.log(obj)收到的回馈是类似对象的4倍

[
   {"test": "Test1", "id": 0},
   {"test": "Test2", "id": 0},
   {"test": "Test3", "id": 0},
   {"test": "Test4", "id": 0},
];

[
   {"test": "Test1", "id": 0},
   {"test": "Test2", "id": 1},
   {"test": "Test3", "id": 0},
   {"test": "Test4", "id": 0},
];

[
   {"test": "Test1", "id": 0},
   {"test": "Test2", "id": 0},
   {"test": "Test3", "id": 2},
   {"test": "Test4", "id": 0},
];

[
   {"test": "Test1", "id": 0},
   {"test": "Test2", "id": 0},
   {"test": "Test3", "id": 3},
   {"test": "Test4", "id": 0},
];

但是我最终收到的却是相同对象的4倍

[
   {"test": "Test1", "id": 0},
   {"test": "Test2", "id": 1},
   {"test": "Test3", "id": 2},
   {"test": "Test4", "id": 3},
];

1 个答案:

答案 0 :(得分:2)

您的问题是,在Promise函数中,您引用的是同一对象,而不是创建克隆。

var newObject = object; // this is a reference, not a copy/clone

相反,您需要创建object数组的深层克隆。 单行执行此操作的一种方法是使用JSON:

var newObject = JSON.parse(JSON.stringify(object));

更好的方法是:

var newObject = object.map(({test, id}) => ({test, id}));