Javascript 获取选项数量的所有变化
我有这个阵列:Javascript 获取选项数量的所有变化,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有这个阵列: options = ['A', 'B', 'C'] 我想提取这些选项的所有变体,所有可能的方向都是由逗号和空格分隔的字符串,它应该如下所示: Variations = ['A', 'B', 'C', 'A, B', 'A, C', 'A, B, C','A, C, B', 'B, A', 'B, C', 'B, A, C', 'B, C, A', 'C, A', 'C, B', 'C, B, A', 'C, A, B'] 在我的实验中,我使用了下面的方法来得到我想要的,但不是
options = ['A', 'B', 'C']
我想提取这些选项的所有变体,所有可能的方向都是由逗号和空格分隔的字符串,它应该如下所示:
Variations = ['A', 'B', 'C', 'A, B', 'A, C', 'A, B, C','A, C, B', 'B, A', 'B, C', 'B, A, C', 'B, C, A', 'C, A', 'C, B', 'C, B, A', 'C, A, B']
在我的实验中,我使用了下面的方法来得到我想要的,但不是精确的
options = ['A', 'B', 'C']
const powerSet = arr => {
return arr.reduce(
(total, value) =>
total.concat(
total.map(totalItem => [value].concat(totalItem).join(', '))
),
[[]]
)
}
const rightLeftArray = powerSet(options)
const leftRightArray = powerSet(options.reverse())
const mergedArrays = rightLeftArray.concat(leftRightArray)
const filteredArray = mergedArrays.filter(el => el.length !== 0)
const uniqArray = [...new Set(filteredArray)]
console.log('uniqArray', uniqArray)
// I Got this result:
uniqArray = ["A", "B", "B, A", "C", "C, A", "C, B", "C, B, A", "B, C", "A, C", "A, B", "A, B, C"]
如果您能用最少的代码获得更准确的结果,我将不胜感激。这样行吗
const options=['A','B','C','D','E']
常量变量=新集合(选项)
设t0=performance.now()
//第1个变体已在“变体”集中初始化
对于(i=2;i
变体。forEach(v=>{
//不要在一个变量中两次添加相同的值,例如“A,A”
如果(v.indexOf(o)!=-1)返回
//“变体”是一个集合,因此它不会存储重复项
variations.add(`${v},${o}`)
})
)
}
设t1=performance.now()
log(“执行时间:+(t1-t0))
console.log(“变体数:”,variations.size)
您可以创建一个递归函数,该函数生成输入元素的所有组合,并返回一个结果数组,如下所示
memo数组用于记住元素是否已添加到上一个函数调用中,以便我们不再添加它
我们使用一个slate来累积当前状态,然后在每次迭代时将连接状态推送到结果数组
注意:
const getCombinations=(选项)=>{
常量结果=[];
const helper=(slate、level、end、memo)=>{
对于(让i=0;谢谢你。你得到了确切的建议结果,但是如果我们尝试增加选项的数量,比如['A','B','C','D','E',],我们会遇到性能问题,甚至我的浏览器会暂停一段时间。聪明的解决方案。你能解释slate.pop()和memo[i]的用途吗=0;在内部循环中?。我做了一些测试,在某种程度上,速度更快。。if语句消除了许多不必要的操作。@M.Dev我编辑了一个解释。解释起来并不容易,所以如果您有任何问题,请随时提问,这样我就可以为未来的读者了解如何更好地解释。我总是得到c我喜欢写一个算法(一步一步的过程)在继续之前。在所有情况下,您的答案都是目前为止最好的。@M.Dev递归可能很难理解。绘制上面这样的图表总是有帮助的。有一些其他方法可以解决这个问题,例如使用交换,但我发现它们更难理解,而且它们不会获得更好的运行时间,也不会使用更少的代码。就运行时间而言时间越快越好。