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中展平数组,但我在这里想知道的是如何使用特定的参数.
首先将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)
仅供参考,有很多方法可以展平数组: