JavaScript 将运算符扩展到可变数量的参数上?

标签 javascript spread-syntax

JavaScript 扩展运算符可以像这样组合数组:

const a = [1,2,3];
const b = [4,5,6];
console.log([...a,...b]);

当“编译时”参数数量未知时我也可以使用它吗?

在下面的示例中,我不知道如何使用展开运算符,因此我使用了 reduceconcat

const arrays = [[1,2,3],[4,5,6]];
console.log(arrays.reduce((a,b)=>a.concat(b)));

这是预期的方式还是我可以以某种方式使用扩展运算符与可变数量的参数?

最佳答案

如果您不知道要传播多少内容,则无法使用 ... 编写传播它们的代码。这就像 + 那样:您可以将三件事加在一起 ​​(a + b + c),但如果您不知道要添加多少,您不能直接为其编写代码。

您的reduce可以使用展开而不是concat(但请继续阅读):

const arrays = [[1,2,3],[4,5,6]];
console.log(arrays.reduce((a,b)=>[...a, ...b]));

但是这和 concat 都是低效的(这可能重要也可能不重要),因为它们创建一个数组并重新复制已经复制的元素每个输入。如果效率是一个限制,只需使用一个简单的循环:

const arrays = [[1,2,3],[4,5,6]];
const result = [];
for (const entry of arrays) {
  result.push(...entry);
}
console.log(result);

或者,如果您确实喜欢在单个表达式中执行此操作,则可以将其硬塞到 reduce 中(因为基本上任何数组操作都可以硬塞到 reduce 中):

const arrays = [[1,2,3],[4,5,6]];
console.log(arrays.reduce((acc,entry) => {
  acc.push(...entry);
  return acc;
}, []));

我和Brian Terlson在一起,不过:对我来说,reduce 被过度使用了。

最后,对于这个特定问题,我们得到 flat现在:

const arrays = [[1,2,3],[4,5,6]];
console.log(arrays.flat());

关于JavaScript 将运算符扩展到可变数量的参数上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391464/

相关文章:

javascript - 如何在 react-redux 中使用扩展运算符修改索引处的特定对象?

javascript - 设置数组等于另一个数组或使用三个点之间的区别

javascript - 在 javascript 函数中使用 jQuery 格式化 HTML

javascript - DEFER 实际上并未推迟

javascript - 使用 Backbone 和 handlebars 在模型中循环数组

javascript - Rails 3 转义 html 标签在浏览器中作为 JSON 时未转义

javascript - 使用 React 扩展运算符在数组中设置 State

typescript - 使用扩展语法时如何删除对象的属性以创建对象的新实例?

javascript - 分配和解包到一个数组到另一个数组之间的区别

javascript - 通过引用扩展对象