在Python中,我可以:l = [{'d': 3}] * 5
获取[{'d': 3}, {'d': 3}, {'d': 3}, {'d': 3}, {'d': 3}]
。
在ES6中执行此操作的等效方法是什么,实际上克隆对象而不仅仅是复制引用?
编辑:基本上,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},
];
答案 0 :(得分:4)
字面上的等价物是
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 的增长,这似乎有所改变。
绝对要使用数字,如果这是一个重要因素,请构建自己的测试。
'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);
&#13;
另请注意,在使用普通函数替换箭头函数时,apply
方法具有有效ES5的优势。
答案 1 :(得分:2)
我想你可以这样做:
new Array(6).fill(0).map(() => ({d: 3}));
(其中6是你想要的数字。)
但是,它并不是那么简洁。答案 2 :(得分:1)
这个解决方案似乎是个不错的选择:
var n = 10;
var items = Array.from(Array(n), _ => ({d: 3}));
使用map函数将确保创建对象的克隆 详细了解Array.from()。
答案 3 :(得分:0)
我不知道在python中复制数组中对象的等价物,但是在JavaScript中对对象属性进行克隆的最简单方法是使用JSON.parse( JSON.stringify([myJsObj])),但如果你在循环中这样做,可能会导致负面的表现。
let o = {d: 3}
let a = [];
for(let i = 0; i < 5; i++) {
a.push(JSON.parse(JSON.stringify(o)));
}
答案 4 :(得分:-1)
l = new Array(3).fill({&#39; d&#39;:3})