Javascript: 如何使用reduce函数和concat数组函数将数组的数组转化为数组?

Javascript: How to use the reduce function and the concat array function to transform an array of arrays into an array?

Javascript:如何使用reduce函数和concat数组函数将数组的数组转化为数组?

在下面的代码中,数组的数组没有被转换,浏览器控制台日志记录了一个空数组。

在下面的代码下,失败的具体原因是什么?

如有任何帮助,我们将不胜感激。

  // use reduce to transform an array of 
  // arrays to one array that combines all.
  // elements.

  function combine(array1d, element)
  {
    array1d.concat(element);

    return array1d;
  }

  function reduce(array2d, combine) {

    let array1d = [];

    for (let element of array2d) {

      array1d = combine(array1d, element);

    }

    return array1d;
  }

  let array2d =  [[1, 2,],[3, 4]];
  console.log(reduce(array2d, combine));

可以先用flat将二维数组转为数组,再用reduce函数添加元素

如果您不需要添加元素,只需删除 reduce

var res = array2d.flat().reduce((prev, curr) => prev + curr);

再见,这里是工作示例:

let array2d =  [[1, 2,],[3, 4]];
let result = array2d.flat(1);
console.log(result);

const res = array2d.reduce((arr, seq) => {
  arr.push(...seq);
  return arr;
}, [])
console.log(res)

你为什么不用老式的方法呢?

function mergeArray(array){
    let finalArray= []
    for(let i=0;i<iarray.lenght;i++){
          for(let j=0;j<array[i].lenght;j++){
                 finalArray.push(array[i][j])
          }
    }
    return finalArray
}

正如您从所有答案中看到的那样,有多种方法可以做到这一点。

  1. 修复原题错误的一个解决方案:
function combine(array1d, element) {
  return array1d.concat(element);
}

function reduce(array2d, reducerFn) {
  let array1d = [];

  for (let element of array2d) {
    array1d = reducerFn(array1d, element);
  }

  return array1d;
}

let array2d =  [[1, 2,],[3, 4]];
console.log(reduce(array2d, combine));

这里的区别是 return array1d.concat(element); 调用而不是 returning array1d 并在其上调用 .concatconcat 没有副作用,所以它创建了一个新数组而不是改变原来的数组。我还将 reduce 中的 combine 重命名为 reducerFn 以更清楚地表明它可以更改为其他名称。

  1. 直接在数组上使用reduce(几乎所有浏览器都支持)
let result = array2d.reduce(function (flattenedArray, element) {
  return flattenedArray.concat(element);
}, []);
  1. 使用 reducespread operator instead of concat (no IE support - if you can drop it, you can also use Arrow functions):
let result = array2d.reduce(function (flattenedArray, element) {
  return [...flattenedArray, ...element];
}, []);
  1. 使用flatMap,恒等函数可以用来展平数组:
let result = array2d.flatMap(element => element);
  1. 使用 flat,将(深度)嵌套数组展平为参数接收的维数:
let result = array2d.flat();
  1. 通过为每个维度创建一个 for 循环来使用命令式样式,按顺序填充数组 - 请参阅
  2. 的回答

flatMapreduce,和 concat 一样,也是 return 一个新数组,没有改变原来的数组。由于原始版本对我来说更像是尝试使用函数式编程风格,所以我想这些是您工具箱的一个很好的补充。 flatMapflat 是相对较新的语言添加,因此根据您需要支持的环境,您最终可能会改用其他语言。