javascript-如何使用给定的回调在JavaScript中将数组弄平?

时间:2019-07-30 07:55:16

标签: javascript arrays flatten

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

我具有必须基于给定的选择器函数(childrenSelector)返回平坦化数组的函数,但是在应用slice()函数时遇到了问题。

将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))

这个问题有解决方案吗?

1 个答案:

答案 0 :(得分:3)

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

Array.isArray(currVal)

已实现,所以

accumArr.concat(currVal.map(childrenSelector))
currVal是一个数字数组时,

运行。但是数字没有.slice方法。

相反,请在childrenSelector上调用currVal,而不使用.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))
);