javascript

时间:2018-08-25 23:19:39

标签: javascript set combinations permutation

我正在尝试编写一个函数来给定排列的数据,如下所示:

  [ 
    { ent: 'animal', vals: [ 'dog', 'cat' ] },
    { ent: 'color', vals: [ 'red', 'blue', 'green' ] },
    { ent: 'owner', vals: [ 'bob', 'david' ] } 
  ]

我想要一个类似的结果

  [
    [animal: dog, color; red, owner: bob],
    [animal: dog, color: red, owner: david],

    [animal: dog, color: blue, owner: bob],

    // ... etc (values as strings)
  ]

甚至只是

[ dog, red, bob ],
[ dog, red, david ],
[ dog, blue, bob ],
// etc (as strings)

基本上是唯一集,例如:

111
112
113
121
122
123
// etc

对每个选项都有值的唯一组合。

我一直在为此使用某种递归函数而没有太多的运气!

与简单字符串有关 Permutations in JavaScript?

我已经找到了一些用于处理排列的库,但是似乎没有一种适用于这种类型的结构。

谢谢!

2 个答案:

答案 0 :(得分:0)

仅需注意,您要尝试执行的操作就是找不到排列。您正在尝试查找不同阵列(每个阵列1个)中所有项目的组合。

这里是“伪代码”以生成组合:

var data=[ 
    { ent: 'animal', vals: [ 'dog', 'cat' ] },
    { ent: 'color', vals: [ 'red', 'blue', 'green' ] },
    { ent: 'owner', vals: [ 'bob', 'david' ] } 
]

var results=[]
function generateCombinations(index, currentResult)
    if index == data.length //base case
        results.push(a copy of currentResult)

    var ent=data[index].ent
    for each value in data[index].vals //loop through all possible values of current data
        currentResult[ent]=value
        generateCombinations(index+1, currentResult)

generateCombinations(0,{})
console.log(results)

应该在控制台上显示您想要的内容。请注意,使用Object.assign创建对象的副本。

递归函数有点难以解释。自己看一下功能并弄清楚它的工作方式可能会更容易。

TLDR:使用DFS(深度优先搜索)生成所有组合

答案 1 :(得分:0)

这类似于普通的组合功能,但因为您可以一次遍历所有级别,所以使用起来更加简单。

这是一种简单的递归方法:

let arr = [ 
    { ent: 'animal', vals: [ 'dog', 'cat' ] },
    { ent: 'color', vals: [ 'red', 'blue', 'green' ] },
    { ent: 'owner', vals: [ 'bob', 'david' ] } 
  ]

function getCombinations(arr){
    if (arr.length === 0) return [[]]
    let [current, ...rest] = arr
    let combinations = getCombinations(rest)
    return current.vals.reduce((a, string) => 
        [ ...a, ...combinations.map(c => [string, ...c])], [])
}
let c = getCombinations(arr)
console.log(c)