此代码执行您想要的操作:
常量arr=[1,2,9,4,7],结果=数组.from({length:2**(arr.length-1)},(_,index)=>index.toString(2).padStart(arr.longth-1,“0”).map((binary)=>JSON.parse(“[”+arr.map((num,position)=>num+(Number(binary[position]))?“,”:“”).加入(“”)+“]”);console.log(结果);
.as-console-wrapper{最大高度:100%!重要;顶部:0;}
其结果是:
[[12947],[1294, 7],[129, 47],[129, 4, 7],[12, 947],[12, 94, 7],[12, 9, 47],[12, 9, 4, 7],[1, 2947],[1, 294, 7],[1, 29, 47],[1, 29, 4, 7],[1, 2, 947],[1, 2, 94, 7],[1, 2, 9, 47],[1, 2, 9, 4, 7]]
假设预期结果不依赖于顺序,空格表示二进制模式:
12947 => 00001294 7 => 0001129 47 => 0010…1 29 47 => 1010…1 2 9 4 7 => 1111
我们可以利用这个模式将计数器转换为二进制字符串0
因此它始终保持4位数长:
index.toString(2).padStart(arr.length-1,“0”)
对于n个中的数字阿珥
,正好有2个n个- 1组合,所以我们使用:
{长度:2**(arr.length-1)}
这是一个具有长度
属性2arr.长度
- 1.
我们将这两件事结合在一起阵列起始位置
接受两个参数的调用:
使用长度
属性转换为数组意味着我们使用长度
许多插槽。
映射函数接受槽的索引作为第二个参数。我们只使用索引作为二进制数的计数器。
最后,整个表达式:
数组.from({length:2**(arr.length-1)},(_,index)=>index.toString(2).padStart(arr.longth-1,“0”)
计算为以下数组:
["0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"]
我们需要进一步将此映射到最终结果:
.map((二进制)=>…)
对于每个数组元素,二元的
是上面数组中的二进制字符串之一。
为了转弯,例如。"0110"
变成类似这样的东西"12,9,47"
,我们需要地图
结束阿珥
也。每个数字号码
从阿珥
后面应该跟,
在位置
,如果二元的
是1
在位置
:
arr.map((num,position)=>num+(数字(二进制[位置])?“,”:“)。联接(”“)
表达式(数字(二进制[位置])?"," : "")
评估二元的
以数字的形式在指定位置。如果是的话真实的,即除0
,其计算结果为","
,如果是虚伪的,即。0
,其计算结果为""
.
所以中间数组看起来像["1", "2,", "9,", "4", "7"]
。所有这些都结合在一起"12,9,47"
.
然后,使用JSON.parse(“[”+
…+ "]")
它被作为数组处理和解析,因此它变成[12, 9, 47]
。由于这些步骤适用于每个二进制字符串,因此最终会得到最终结果。
2**(棱长-1)
可以替换为数学.pow(2,arr.length-1)
如果不支持ECMAScript 7。
{长度:2**(arr.length-1)}
可以替换为新数组(2**(arr.length-1))
.
(数字(二进制[位置])?"," : "")
可以替换为[“,”,“][数字(二进制[位置])]
。在这种情况下,计算的数字将用作临时数组的索引。