你如何在参数而不是特定的数组或对象上使用.reduce()?

Alj*_*vic 2 javascript reduce arguments flatten

我想定义一个函数.flatten,它将几个元素展平为一个单独的数组.我知道以下是不可能的,但基本上我想这样做:

var flatten = function() {
   var flattened = arguments.reduce(function(acc, elem) { return acc.concat(elem) }, []);
   return flattened;
}; 

var arr = [[1,2,3], 4, 5, [6, 7]];
console.log(flatten(arr)) // => [1,2,3,4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError: arguments.reduce is not a function
Run Code Online (Sandbox Code Playgroud)

我理解上面的错误是因为参数只是类似数组,所以它没有真正数组的全部功能.所以有以下内容,但我想知道是否有更清洁的东西:

var flatten = function() {
  var flattened = [].reduce.call(arguments, function(acc, elem) { return acc.concat(elem) });
  return flattened;
};
Run Code Online (Sandbox Code Playgroud)

使用.reduce()重写.flatten的好方法吗?

注意:我知道还有很多其他方法可以在javascript中展平数组,但我在这里想知道的是如何使用特定的参数.

jfr*_*d00 6

首先将arguments对象转换为数组:

var flatten = function() {
   var args = Array.prototype.slice.call(arguments);
   var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
   return flattened;
};
Run Code Online (Sandbox Code Playgroud)

或者,arguments直接在对象上使用数组方法:

var flatten = function() {
   var flattened = Array.prototype.reduce.call(arguments, function(acc, elem) { return acc.concat(elem) }, []);
   return flattened;
};
Run Code Online (Sandbox Code Playgroud)

在ES6中,您可以使用Array.from()将任何可迭代或类似数组的对象转换为实际数组:

var flatten = function() {
   var args = Array.from(arguments);
   var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
   return flattened;
};
Run Code Online (Sandbox Code Playgroud)

仅供参考,有很多方法可以展平数组:

在JavaScript中合并/展平数组数组?

如何在javascript中展平嵌套数组?

在JavaScript中展平多维数组