【问题标题】:forEach loop assigns the same random numberforEach 循环分配相同的随机数
【发布时间】:2020-02-20 07:11:31
【问题描述】:

在打字稿中,我试图为数组中每个对象的属性分配一个随机数。我试过下面的代码

uniqueItems.forEach(unique => {
  unique.humanCode = Math.floor(1000 + Math.random() * 9000).toString();
});

如果我在 forEach 循环内进行 console.log,我会得到一个不同的数字,但是当我 console.log 在 forEach 之后的对象数组时,所有随机数都是相同的。

编辑:我最初通过使用

创建了我的对象数组
for (let i = 0; i < this.quantity; i++) {
  this.uniqueItems.push(uniqueItem);
}

这产生了一个相同对象的数组。这意味着我的数组被分配了最后一个随机数。我在创建数组时使用扩展运算符解决了这个问题。

for (let i = 0; i < this.quantity; i++) {
  this.uniqueItems.push({ ...this.uniqueItem });
}

【问题讨论】:

  • 什么对象数组?
  • 听起来你有一个对象数组,它们都是同一个对象
  • Kryten 是对的。 uniqueItems 不是唯一的项目。展示你如何生产你的阵列。您可能多次将同一个对象添加到数组中,而不是创建新对象。
  • 你用 console.log 打印什么,unique 或 unique.humanCode ?

标签: javascript typescript


【解决方案1】:

您可以使用 map 遍历您的项目并为数组中的每个项目返回一个新对象。这也将确保您不会通过引用更新对象。您应该阅读 JavaScript 中的可变性。这是 JS 中的一个重要概念

uniqueItems.map(unique => ({
  ...unique, 
  humanCode: Math.floor(1000 + Math.random() * 9000).toString(),
}));

【讨论】:

  • 我的数组是同一个对象的数组。为了解决这个问题,我在创建数组 `{...this.uniqueItem} 时使用了扩展运算符
【解决方案2】:

我已经尝试了下面的代码,它对我有用。

let uniqueItems = [{
    humanCode: 0,
  },
  {
    humanCode: 0,
  },
  {
    humanCode: 0,
  },
]
uniqueItems.forEach(unique => {
  unique.humanCode = Math.floor(1000 + Math.random() * 9000).toString();
});

console.log(uniqueItems);

【讨论】:

  • 在 forEach 中改变对象不是一个好习惯。在这种情况下,您最好使用map
  • 谢谢@KiaiFighter!我只是想帮助他处理他现有的代码。
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2013-10-22
  • 2015-11-15
相关资源
最近更新 更多