一个对象的所有键值对组合成数组的方式

3
我将为您提供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个回答

5
您可以使用这个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));

说明

主要函数使用给定对象的键数组(使用Object.keys)并将其传递给递归函数(recurse)。

此内部函数首先检查是否存在键,如果没有,则递归结束,并返回一个仅具有单个空对象的数组。

在所有其他情况下,该函数以一个较少的键进行递归调用。

然后迭代该递归调用的结果(使用result.map()),并为每个条目生成一个新对象,该对象具有一个更多属性 -- 当前键(即来自键数组的第一个键)和该键的当前值。使用reduce()对值进行迭代,对于每个这样的值都重复上述过程。这些子结果使用acc.concat()连接成一个较大的数组,该数组返回给调用方。


太棒了。我知道reduce会成为其中的一部分。谢谢! - maxedison

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

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

我应该更清楚地表达我的问题——解决方案不能知道原始对象中有哪些键。 - maxedison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接