.flat()不是函数,怎么了?

时间:2018-06-22 18:07:45

标签: javascript arrays flat

以下代码

function steamrollArray(arr) {
  // I'm a steamroller, baby
  return arr.flat();
}

steamrollArray([1, [2], [3, [[4]]]]);

返回

  

arr.flat不是函数

我在 Firefox Chrome v67 中进行了尝试,并且发生了相同的结果。

怎么了?

6 个答案:

答案 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);

即使我不确定是否会出现任何兼容的浏览器问题,它也像一种魅力。

相关问题