什么'这是ES6中制作重复元素列表的等效方法
What's the equivalent way in ES6 of making list of duplicated elements?
在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})
相关文章:
- 将列表元素动画制作到顶部
- 使用Razor和javascript来获得下拉列表元素
- 根据列表元素的值使用JQuery获取列表元素
- 将列表元素动态添加到ul元素中
- 使用 jquery 库获取锚点列表元素内的文本
- 在没有大量回调函数的情况下在列表元素上循环播放同一动画
- 使用JSON和JavaScript添加额外的html列表元素
- 范围和列表元素在 DIV 中换行
- jQuery:影响相同深度的列表元素
- 所选列表元素不会保持选中状态(通过ajax请求更新后)
- 一次显示n个列表元素,jQuery
- 将列表元素宽度设置为文本宽度
- 选择列表元素(捕获向下/向上箭头)
- 限制要在嵌套列表jQuery中添加的列表元素的数量
- 如何从有序列表中选择一个列表元素
- 将列表元素 onclick 事件绑定到单选输入
- 每个列表元素的角度
- JQUERY 在多个无序列表中选择第 n 个列表元素
- 通过将文本替换为类来换行/中断列表元素
- 按类名包装列表元素