使用函数式编程复制数组的元素

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)

Mat*_*gan 6

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)

正如在此处的其他答案中所提到的,这些方法中的任何一种都具有不需要对原始阵列进行排序的优点.


Ele*_*Ele 4

您可以使用该函数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)