【问题标题】:How to flatten array with the given callback in Javascript?如何在Javascript中使用给定的回调展平数组?
【发布时间】:2019-12-07 13:28:07
【问题描述】:

该函数必须将指定数组的每个元素投影到一个序列中,并将结果序列展平为一个数组。

我的函数必须根据给定的选择器函数 (childrenSelector) 返回展平数组,但在应用 slice() 函数时遇到问题。

当应用切片作为选择器函数时,它说

TypeError: x.slice 不是函数

function flattenArray(arr, childrenSelector) {
  return arr.reduce((accumArr, currVal) => {
      console.log(currVal);
      return Array.isArray(currVal) 
        ? accumArr.concat(currVal.map(childrenSelector)) 
        : accumArr.concat(childrenSelector(currVal))
    }, []
  );
}

flattenArray([[11, 12, 13, 14, 15], [21, 22, ,23, 24, 25], [31, 32, 34, 35]], x => x.slice(0, 2))

这个问题有解决办法吗?

【问题讨论】:

  • 想要的输出是什么?
  • 那么,它应该先对每个子数组进行切片,然后将它们组合成一个平面数组?

标签: javascript arrays flatten


【解决方案1】:

问题在于,当迭代外部数组时,条件

Array.isArray(currVal)

满足了,所以

accumArr.concat(currVal.map(childrenSelector))

currVal 是一个数字数组时运行。但是数字没有.slice 方法。

相反,在currVal 上调用childrenSelector,而不使用.map(以便对数组进行切片):

function flattenArray(arr, childrenSelector) {
  return arr.reduce((accumArr, currVal) => {
    return accumArr.concat(childrenSelector(currVal));
  }, []);
}

console.log(
  flattenArray([
    [11, 12, 13, 14, 15],
    [21, 22, , 23, 24, 25],
    [31, 32, 34, 35]
  ], x => x.slice(0, 2))
);

你也可以使用flatMap:

const flattenArray = (arr, childrenSelector) => arr.flatMap(childrenSelector);

console.log(
  flattenArray([
    [11, 12, 13, 14, 15],
    [21, 22, , 23, 24, 25],
    [31, 32, 34, 35]
  ], x => x.slice(0, 2))
);

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 2020-09-06
    • 2019-11-24
    • 2018-11-13
    • 1970-01-01
    • 2021-06-03
    • 2015-08-15
    相关资源
    最近更新 更多