对象的所有组合以及其键的数组值

时间:2017-03-27 20:09:02

标签: javascript data-structures combinatorics

我实际上是在寻找等同于this answer的JavaScript,特别是在该响应中提供的第一种格式。

换句话说,给定对象:

let variants = {
  debug : ["on", "off"],
  locale : ["de_DE", "en_US", "fr_FR"],
}

我想要一个返回的函数:

[{debug: 'on', locale: 'de_DE'},
 {debug: 'on', locale: 'en_US'},
 {debug: 'on', locale: 'fr_FR'},
 {debug: 'off', locale: 'de_DE'},
 {debug: 'off', locale: 'en_US'},
 {debug: 'off', locale: 'fr_FR'}]

我正在寻找的解决方案应该不知道输入对象中有哪些键。

2 个答案:

答案 0 :(得分:3)

您可以使用此ES6功能:

function combinations(variants) {
    return (function recurse(keys) {
        if (!keys.length) return [{}];
        let result = recurse(keys.slice(1));
        return variants[keys[0]].reduce( (acc, value) =>
            acc.concat( result.map( item => 
                Object.assign({}, item, { [keys[0]]: value }) 
            ) ),
            []
        );
    })(Object.keys(variants));
}                     

// Sample data
let variants = {
  debug : ["on", "off"],
  locale : ["de_DE", "en_US", "fr_FR"],
};
// Result
console.log(combinations(variants));

解释

main函数获取给定对象的键数组(带Object.keys),并将其传递给递归函数(recurse)。

这个内部函数首先检查是否有键,如果不是递归结束,则返回一个带有单个空对象的数组。

在所有其他情况下,使用少一个键递归调用该函数。

然后迭代该递归调用的结果(使用result.map())并且对于每个条目,生成具有一个或多个属性的新对象 - 当前键(即,键的数组中的第一个)以及该密钥的当前值。使用reduce()迭代这些值,并对每个这样的值重复上述操作。这些子结果与acc.concat()连接成一个更大的数组,返回给调用者。

答案 1 :(得分:1)

var debugCombs = [];
for(var debugVal in debug) {
    for(var localeVal in locale) {
         debugCombs.push({debug: debugVal, locale: localeVal});
    }
}

我希望这是相当自我解释的:遍历每个列表并将其全部推送到数组。