什么'这是ES6中制作重复元素列表的等效方法

What's the equivalent way in ES6 of making list of duplicated elements?

本文关键字:列表 元素 方法 这是 ES6 什么      更新时间:2023-09-26

在Python中,我可以执行:l = [{'d': 3}] * 5来获取[{'d': 3}, {'d': 3}, {'d': 3}, {'d': 3}, {'d': 3}]

在ES6中执行此操作的等效方法是什么,即实际上克隆对象,而不仅仅是复制引用?

edit:基本上,ES6中有没有制作以下数组的快捷方式:

const arr = [
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
   {"d": 3},
];

文字等价物是

const arr = Array(5).fill({d: 3}); 

这将使用相同的对象引用填充数组五次。

获得克隆的过程稍微复杂一些。考虑:

Array.apply(null, Array(5)).map(_ => ({d: 3}));

Array(5).fill(0).map(_ => ({d: 3}));

下面是一个快速而肮脏的性能比较。对于n的小尺寸,O(n)fill似乎比创建两个数组执行得更好。随着n的增长,这种情况似乎发生了逆转。

如果这是一个重要因素,一定要玩数字游戏,并构建自己的测试。

JSFiddle

'use strict';
const loops = 100000;
const size = 50;
const a0 = performance.now();
for (let i = 0; i < loops; i++)
	Array.apply(null, Array(size)).map(_ => ({d: 3}));
const a1 = performance.now();
console.log('Apply %fms', a1 - a0);
const f0 = performance.now();
for (let i = 0; i < loops; i++)
	Array(size).fill(0).map(_ => ({d: 3}));
const f1 = performance.now();
console.log('Fill %fms', f1 - f0);

此外,请注意,当用正常函数替换箭头函数时,apply方法具有有效ES5的优点

我想你可以这样做:

new Array(6).fill(0).map(() => ({d: 3}));

(其中6是您想要的数字。)

不过,它并没有那么简洁。

这个解决方案似乎是一个不错的选择:

var n = 10;
var items = Array.from(Array(n), _ => ({d: 3}));

使用映射功能将确保创建对象的克隆
查看有关Array.from()的更多信息。

我不知道有什么等效方法可以像从python复制数组中的对象一样,但在JavaScript中克隆对象属性的最简单方法是使用JSON.parse(JSON.stringfy([myJsObj])),但如果在循环中这样做,可能会导致负面性能。

let o = {d: 3}
let a = [];
for(let i = 0; i < 5; i++) {
    a.push(JSON.parse(JSON.stringify(o)));
}

l=new Array(3).fill({'d':3})