uyl*_*lmz 6 javascript arrays functional-programming object
我正在尝试复制数组中的每个元素,但使用的是函数式.
我现在有这个:
["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
["a","a","b","b","c","c"]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了以下内容,将每个元素映射到一个数组,然后使用flat()来获取一个数组.是否有一种更清洁的方式,因为它感觉我在滥用地图和平面.
["a", "b", "c"].map(item => [item, item]).flat();
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我试图提供一个尽可能简单的例子,但留下一些细节.实际输入未排序,因为元素不具有可比性.它是这样的:
[
{
a:"a"
b:"b"
},
{
c: 1
d: 2
},
{
apple: {},
sellers: ["me", "her"]
}
]
Run Code Online (Sandbox Code Playgroud)
重复的结果应该是这样的,其中重复的元素彼此相邻:
[
{
a:"a"
b:"b"
},
{
a:"a"
b:"b"
},
{
c: 1
d: 2
},
{
c: 1
d: 2
},
{
apple: {},
sellers: ["me", "her"]
},
{
apple: {},
sellers: ["me", "her"]
}
]
Run Code Online (Sandbox Code Playgroud)
Array.reduce
在语义上是这里适当的方法:获取一个对象(在这种情况下是一个数组)并返回一个不同类型的对象,或者使用不同的长度或形状(注意:编辑为使用Array.push以便根据@slider建议提高性能) :
编辑:我编辑了我的答案,以反映OP的更新输入数据. 另请注意,此解决方案是跨浏览器和NodeJS兼容,无需转换.
let data = [
{
a:"a",
b:"b",
},
{
c: 1,
d: 2
},
{
apple: {},
sellers: ["me", "her"]
}
];
let result = data
.reduce((acc, el) => {
acc.push(el, el);
return acc;
}, []);
console.log(JSON.stringify(result, null, 2));
Run Code Online (Sandbox Code Playgroud)
否则你可以将map
每个元素复制,然后将它们组合起来:
let data = [
{
a:"a",
b:"b",
},
{
c: 1,
d: 2
},
{
apple: {},
sellers: ["me", "her"]
}
];
let result = data.map(item => [item, item]).reduce((acc, arr) => acc.concat(arr));
console.log(JSON.stringify(result, null, 2));
Run Code Online (Sandbox Code Playgroud)
正如在此处的其他答案中所提到的,这些方法中的任何一种都具有不需要对原始阵列进行排序的优点.
您可以使用该函数reduce
并在每次迭代中连接相同的对象。
let array = ["a", "b", "c"],
result = array.reduce((a, c) => a.concat(c, c), []);
console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
162 次 |
最近记录: |