我正在尝试编写一个函数来给定排列的数据,如下所示:
[
{ 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?
我已经找到了一些用于处理排列的库,但是似乎没有一种适用于这种类型的结构。
谢谢!
答案 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)