gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:31:14 25 4
gpt4 key购买 nike

我想定义一个函数 .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]

我收到以下错误:

TypeError: arguments.reduce is not a function

我理解上面的错误是因为arguments只是类似数组的,所以它不具备真正数组的全部功能。所以有以下内容,但我想知道是否有更干净的东西:

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

有什么好的方法可以使用 .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;
};

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

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

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

var flatten = function() {
var args = Array.from(arguments);
var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};
<小时/>

2021 年使用现代语言功能进行更新:

function flatten(...args) {
return args.flat();
}

而且,如果您想展平到更深的级别,而不仅仅是向下一级,则可以将深度传递给 .flat(n)(默认值为 1)。

尽管如此,由于我们现在已将这些更现代的功能内置到语言中,因此您可能可以更直接地使用它们,而不是将它们传递给函数来处理它们,但我们必须看到一些特定的用例才能使有关解决问题的内联方法的建议,而不是使用此函数。

<小时/>

仅供引用,有很多方法可以展平数组:

Merge/flatten an array of arrays

How to flatten nested array in javascript?

Flattening multidimensional Arrays in JavaScript

Array.prototype.flat() method

关于javascript - 如何在参数上使用 .reduce() 而不是特定的数组或对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com