gpt4 book ai didi

javascript - JavaScript 中多个数组的笛卡尔积

转载 作者:行者123 更新时间:2023-11-28 08:09:34 26 4
gpt4 key购买 nike

如何在 JavaScript 中实现多个数组的笛卡尔积?

举个例子,

cartesian([1, 2], [10, 20], [100, 200, 300]) 

应该返回

[
[1, 10, 100],
[1, 10, 200],
[1, 10, 300],
[2, 10, 100],
[2, 10, 200]
...
]

最佳答案

2020 更新:使用普通 JS 进行 1 行 (!) 回答

2017 年原始答案:使用普通 JS 的 2 行答案:(请参阅下面的更新)

这里的所有答案都过于复杂,其中大多数需要 20 行代码甚至更多。

此示例仅使用两行普通 JavaScript,没有 lodash、下划线或其他库:

let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));
let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;

更新:

这与上面相同,但经过改进以严格遵循 Airbnb JavaScript Style Guide - 使用 ESLint 进行验证与 eslint-config-airbnb-base :

const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e))));
const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);

特别感谢 ZuBB 让我了解原始代码的 linter 问题。

2020 年更新:

自从我写了这个答案以来,我们得到了更好的内置函数,这最终可以让我们将代码减少到只有 1 行(没有双关语)!

const cartesian =
(...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));

特别感谢inker建议使用reduce。

特别感谢 Bergi 建议使用新添加的 flatMap。

特别感谢ECMAScript 2019 用于将 flat 和 flatMap 添加到语言中!

示例

这是您的问题的确切示例:

let output = cartesian([1,2],[10,20],[100,200,300]);

输出

这是该命令的输出:

[ [ 1, 10, 100 ],
[ 1, 10, 200 ],
[ 1, 10, 300 ],
[ 1, 20, 100 ],
[ 1, 20, 200 ],
[ 1, 20, 300 ],
[ 2, 10, 100 ],
[ 2, 10, 200 ],
[ 2, 10, 300 ],
[ 2, 20, 100 ],
[ 2, 20, 200 ],
[ 2, 20, 300 ] ]

演示

查看演示:

语法

我在这里使用的语法并不新鲜。我的示例使用扩展运算符和其余参数 - 2015 年 6 月发布的 ECMA-262 标准第六版中定义的 JavaScript 功能,并且开发得更早,更广为人知的名称是 ES6 或 ES2015。请参阅:

ES2019 中添加了 Update 2020 示例中的新方法:

它使这样的代码变得如此简单,不使用它就是一种罪过。对于本身不支持它的旧平台,您始终可以使用 Babel 或其他工具将其转译为旧语法 - 事实上,我用 Babel 转译的示例仍然比这里的大多数示例更短、更简单,但它并没有真的很重要,因为转译的输出不是您需要理解或维护的东西,这只是我发现有趣的事实。

结论

当两行普通 JavaScript 可以轻松完成工作时,无需编写数百行难以维护的代码,也无需使用整个库来完成如此简单的事情。正如你所看到的,使用该语言的现代功能确实是值得的,如果你需要支持古老的平台,而没有对现代功能的 native 支持,你可以随时使用 BabelTypeScript 或其他工具将新语法转换为旧语法。

不要像 1995 年那样编码

JavaScript 的发展是有原因的。 TC39 通过添加新功能在语言设计方面做得非常出色,浏览器 vendor 在实现这些功能方面也做得非常出色。

要查看浏览器中任何给定功能的 native 支持的当前状态,请参阅:

要查看 Node 版本的支持,请参阅:

要在本身不支持现代语法的平台上使用现代语法,请使用 Babel 或 TypeScript:

关于javascript - JavaScript 中多个数组的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24436926/

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