在JavaScript中创建对象数组的所有组合

在JavaScript中创建对象数组的所有组合,javascript,Javascript,我想找到n-数组的options属性的所有组合。在本例中,数组的长度为3,但该函数也应使用较大或较小的数组大小 var arr = [{ name: 'Fruit', options: ['apple', 'kiwi'] }, { name: 'Food', options: ['bread', 'rice'] }, { name: 'Drink', options: ['water', 'cola'] }] 结果应打印以下语句 Fruit: a

我想找到n-数组的options属性的所有组合。在本例中,数组的长度为3,但该函数也应使用较大或较小的数组大小

var arr = [{
    name: 'Fruit',
    options: ['apple', 'kiwi']
}, {
    name: 'Food',
    options: ['bread', 'rice']
}, {
    name: 'Drink',
    options: ['water', 'cola']
}]
结果应打印以下语句

Fruit: apple | Food: bread | Drink: water
Fruit: apple | Food: bread | Drink: cola
Fruit: apple | Food: rice | Drink: water
Fruit: apple | Food: rice | Drink: cola
Fruit: kiwi | Food: bread | Drink: water
Fruit: kiwi | Food: bread | Drink: cola
Fruit: kiwi | Food: rice | Drink: water
Fruit: kiwi | Food: rice | Drink: cola
我已经读过这个答案,但在我的示例中,数组是一个对象,我不知道如何获取属性。这就是我到目前为止所做的:

function allPossibleCases(arr) {
    if (arr.length === 0) {
        return [];
    } else if (arr.length ===1){
        return arr[0].options;
    } else {
        var result = [];
        var allCasesOfRest = allPossibleCases(arr.slice(1));  // recur with the rest of array
        for (var c in allCasesOfRest) {
            for (var i = 0; i < arr[0].options.length; i++) {
                console.log(arr[0].name, ": ", arr[0].options[i], "| ", allCasesOfRest[c])
            }
        }
        return result;
    }
}

我缺少什么?

您可以获取值,构建笛卡尔积并映射属性

var数组=[{name:'水果',选项:['apple','kiwi']},{name:'食品',选项:['bread','rice']},{name:'饮料',选项:['water','cola']},
keys=array.map(({name})=>name),
结果=数组
.map(({options})=>options)
.reduce((a,b)=>a.reduce((r,v)=>r.concat(b.map(w=>[]),concat(v,w)),[]))
.map(a=>Object.assign(…keys.map((k,i)=>({[k]:a[i]}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以获取值,构建笛卡尔乘积并映射属性

var数组=[{name:'水果',选项:['apple','kiwi']},{name:'食品',选项:['bread','rice']},{name:'饮料',选项:['water','cola']},
keys=array.map(({name})=>name),
结果=数组
.map(({options})=>options)
.reduce((a,b)=>a.reduce((r,v)=>r.concat(b.map(w=>[]),concat(v,w)),[]))
.map(a=>Object.assign(…keys.map((k,i)=>({[k]:a[i]}));
控制台日志(结果)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
Food :  bread |  water
Food :  rice |  water
Food :  bread |  cola
Food :  rice |  cola