以下代码
function steamrollArray(arr) {
// I'm a steamroller, baby
return arr.flat();
}
steamrollArray([1, [2], [3, [[4]]]]);
返回
arr.flat
不是函数
我在 Firefox 和 Chrome v67 中进行了尝试,并且发生了相同的结果。
怎么了?
答案 0 :(得分:19)
这也可以。
let arr = [ [1,2,3], [2,3,4] ];
console.log([].concat(...arr))
或者对于较旧的浏览器,
[].concat.apply([], arr);
答案 1 :(得分:14)
在常见的浏览器(仅Chrome v69,Firefox Nightly和Opera 56)中,flat
方法是not yet implemented。这是一项实验性功能。因此,您不能还使用它。
您可能希望拥有自己的flat
函数:
Object.defineProperty(Array.prototype, 'flat', {
value: function(depth = 1) {
return this.reduce(function (flat, toFlatten) {
return flat.concat((Array.isArray(toFlatten) && (depth>1)) ? toFlatten.flat(depth-1) : toFlatten);
}, []);
}
});
console.log(
[1, [2], [3, [[4]]]].flat(2)
);
该代码是由here摘自Noah Freitas的,其最初实现是在未指定depth
的情况下平整数组。
答案 2 :(得分:5)
Array.flat
在您的浏览器中不是supported。下面是两种实现方法。
作为函数:depth
变量指定input
数组结构应展平的深度(默认为1;使用Infinity
展平深度),而{ {1}}是扁平数组,在递归调用中由引用传递。
stack
填充,扩展function flat(input, depth = 1, stack = [])
{
for (let item of input)
{
if (item instanceof Array && depth > 0)
{
flat(item, depth - 1, stack);
}
else {
stack.push(item);
}
}
return stack;
}
:
Array.prototype
答案 3 :(得分:2)
类似问题,使用 ES6 的 .reduce() 方法解决:
const flatArr = result.reduce((acc, curr) => acc.concat(curr),[]);
答案 4 :(得分:0)
使用lodash包中的_.flatten;)
答案 5 :(得分:-1)
不确定是不是有效的答案,但是在我尝试使用ES6中引入的destructuring_assignment整理数组的过程中。
// typeScriptArray:Array<Object> = new Array<Object>();
let concatArray = [];
let firstArray = [1,2,3];
let secondArray = [2,3,4];
concatArray.push(...firstArray);
concatArray.push(...secondArray);
console.log(concatArray);
即使我不确定是否会出现任何兼容的浏览器问题,它也像一种魅力。