使用 JavaScript 中的 reduce 函数将数组扁平化

5

我对使用reduce有点困惑。

它的用法是array.reduce((accumulator, value) => 对accumulator进行一些操作,但为什么会返回一个空数组呢?

let a = [
  [1,2],
  [
    [3,4]
  ],
  [
    [[5],[6]]
  ]
];

const flatten = arr => arr.reduce((a, v) => {
  v instanceof Array ? flatten(v) : a.push(v);
  return a;
}, [])


console.log(flatten(a));


Array.prototype.flat()Array.prototype.flatMap()为什么没有被使用? - guest271314
2
我正在学习如何使用reduce,但知道有一个本地方法很好。 - totalnoob
3个回答

6
< p > flatten(v) 返回一个数组,但是目前你没有对它做任何操作。尝试将展开的数组推入累加器中:

提示:展开数组可使用扩展运算符(spread operator)。

let a = [
  [1,2],
  [
    [3,4]
  ],
  [
    [[5],[6]]
  ]
];

const flatten = arr => arr.reduce((a, v) => {
  v instanceof Array ? a.push(...flatten(v)) : a.push(v);
  return a;
}, [])


console.log(flatten(a));

或者,您可以使用concat,并且只在需要整个内容解析为表达式时使用条件运算符(不要将其用作if/else的替代品):

let a = [
  [1,2],
  [
    [3,4]
  ],
  [
    [[5],[6]]
  ]
];

const flatten = arr => arr.reduce((a, v) => {
  if (v instanceof Array) {
    return a.concat(flatten(v))
  } else {
    a.push(v);
    return a;
  }
}, [])


console.log(flatten(a));


啊,所以将数据推送到累加器必须在同一个循环中完成。 - totalnoob
要么这样做,或者将累加器数组传递到每个递归调用中。 - CertainPerformance

0

let array = [[2, 4, 6, 8], [10, 12, 14], [16, 18, 20, 22]]

const flatten = array.reduce((a, b) => {
  return a.concat(b)
})

console.log(flatten)

.concat 连接两个数组,reduce 在内部执行循环,并通过连接来压平结果。


请阅读如何撰写好的答案?。虽然这个代码块可能回答了OP的问题,但如果您解释一下这段代码与问题中的代码有何不同,您做了哪些更改,为什么要更改以及为什么这样解决问题而不会引入其他问题,那么这个答案将会更加有用。 - Saeed Zhiany

0

let arr = [[1,2],[[3,4]],[[[5],[6]]]];

const flattenArr = (arr) => 
  arr.reduce((acc, val) => 
   Array.isArray(val) ? 
    acc.concat(flattenArr(val)) :
     acc.concat(val), []);
 
console.log(flattenArr(arr));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接