перестановки объектов в javascript - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь написать функцию, которая дает перестановки для заданного массива данных:

  [ 
    { 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

Уникальные комбинации, которые имеют значение для каждого из параметров.

Я боролся с какой-то рекурсивной функцией без особой удачи!

относится к простым строкам Перестановки в JavaScript?

Я нашел несколько библиотек для работы с перестановками, но ничего подобного не работает с такими структурами.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Это похоже на обычную комбинированную функцию, но немного проще, поскольку вы можете проходить уровни одновременно.

Вот простой рекурсивный подход:

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)
0 голосов
/ 26 августа 2018

Просто обратите внимание, что вы пытаетесь не найти перестановок. Вы пытаетесь найти все комбинации элементов из разных массивов (по 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 (поиск в глубину) для генерации всех комбинаций

...