使用像ES6这样的现代标准来动态填充空对象文字的最佳方法是什么?

时间:2019-03-22 21:00:51

标签: javascript for-loop ecmascript-6 iteration

在我的示例中,我有一个受ES5支持的普通for循环,它可以完成我想要的操作。最近发现,ES6中的所有新循环都是Array对象的原型方法。

考虑到这一点,我想知道是否存在迭代数字s的新的最佳实践,或者for循环是否仍然有用。像我的示例那样的接缝将是使for循环保持相关性的合理用例。

示例:(参考注释进行编辑)

const entries = {};

for (let i = 0; i < 5; i++) {
  entries[`entry${i}`] = 'Some string';
}

返回:{entry0: "Some string", entry1: "Some string", entry2: "Some string", entry3: "Some string", entry4: "Some string"}

2 个答案:

答案 0 :(得分:2)

使用数组函数时要小心,将它们串在一起的人越多,在后台创建的循环就越多。例如,使用以下代码:

const sum = [1,1,2,3,null,4,5,5,6]
  .filter(Boolean)
  .map(i => i * 2)
  .reduce((sum, val) => sum + val, 0)

您正在后台创建3个循环:

  • 一个循环来过滤值
  • 一个循环以将值相乘
  • 一个循环以求和

对于您的问题,您可以通过创建一个数组,填充每个值(否则不会迭代),然后进行一次forEach来与这些函数进行类似的操作。

const entries = {};

new Array(5).fill(null).forEach((itm, i) => entries[`entry${i}`] = 'Some string')

console.log(entries)

最后,选择最适合您的应用程序的方法。 for ... in/of几乎总是比内置数组函数执行得更快,因此,如果您要进行大量处理,for ... in/of是最好的选择,否则内置函数应该可以正常工作。

答案 1 :(得分:2)

您可以使用所需键映射新对象,然后将所有对象分配给现有对象。

零件:

const
    entries = {},
    length = 5;

Object.assign(entries, ...Array.from({ length }, (_, i) => ({ [`entry${i}`]: 'Some string' })));

console.log(entries);