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来累积当前状态,然后在每次迭代时将连接状态推送到结果数组

注意:

  • 如果数组中只有一个项,则该方法将返回不带分隔符的项
  • 我添加了一个计时器来测量执行时间。由5个元素组成的输入阵列的运行时间约为0.3毫秒
  • 以下测试:

    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递归可能很难理解。绘制上面这样的图表总是有帮助的。有一些其他方法可以解决这个问题,例如使用交换,但我发现它们更难理解,而且它们不会获得更好的运行时间,也不会使用更少的代码。就运行时间而言时间越快越好。