该函数必须将指定数组的每个元素投影到一个序列,并将生成的序列展平为一个数组。
我具有必须基于给定的选择器函数(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))
这个问题有解决方案吗?
答案 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))
);