我在编写代码时难以在JavaScript中生成包含m个元素的n个数组的组合.我已经在其他语言中看到了类似的问题,但答案包含语法或库魔法,我不确定如何翻译.
考虑这些数据:
[[0,1], [0,1,2,3], [0,1,2]]
Run Code Online (Sandbox Code Playgroud)
3个数组,其中包含不同数量的元素.我想要做的是通过组合每个数组中的项来获得所有组合.
例如:
0,0,0 // item 0 from array 0, item 0 from array 1, item 0 from array 2
0,0,1
0,0,2
0,1,0
0,1,1
0,1,2
0,2,0
0,2,1
0,2,2
Run Code Online (Sandbox Code Playgroud)
等等.
如果数组的数量是固定的,那么很容易进行硬编码实现.但阵列的数量可能会有所不同:
[[0,1], [0,1]]
[[0,1,3,4], [0,1], [0], [0,1]]
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
查看Ramda.js的来源,特别是"升力"功能.
这是给定的例子:
var madd3 = R.lift(R.curry((a, b, c) => a + b + c));
madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
因此结果的第一数目是容易的,a,b,和c,是每个阵列的所有的第一元素.第二个对我来说并不容易理解.参数是每个数组的第二个值(2,2,未定义)还是第一个数组的第二个值以及第二个和第三个数组的第一个值?
即使无视这里发生的事情的顺序,我也没有真正看到它的价值.如果我在没有lift它的情况下执行它,我将最终将数组concat作为字符串.这似乎有点像,flatMap但我似乎无法遵循其背后的逻辑.
我有这个递归发生器
var obj = [1,2,3,[4,5,[6,7,8],9],10]
function *flat(x) {
if (Array.isArray(x))
for (let y of x)
yield *flat(y)
else
yield 'foo' + x;
}
console.log([...flat(obj)])Run Code Online (Sandbox Code Playgroud)
它工作正常,但我不喜欢这for部分.有没有办法在功能上写它?我试过了
if (Array.isArray(x))
yield *x.map(flat)
Run Code Online (Sandbox Code Playgroud)
这没用.
有没有办法在没有for循环的情况下编写上述函数?
javascript ×3
combinations ×1
ecmascript-6 ×1
generator ×1
lifting ×1
permutation ×1
ramda.js ×1
yield ×1