对象及其键的数组值的所有组合
All combinations of of an object with array values for its keys
我实际上是在寻找 this answer 的 JavaScript 等价物,特别是在该响应中提供的第一种格式中。
换句话说,给定对象:
let variants = {
debug : ["on", "off"],
locale : ["de_DE", "en_US", "fr_FR"],
}
我想要一个 returns:
的函数
[{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'}]
我正在寻找的解决方案应该不知道输入对象中有哪些键。
var debugCombs = [];
for(var debugVal in debug) {
for(var localeVal in locale) {
debugCombs.push({debug: debugVal, locale: localeVal});
}
}
我希望这是不言自明的:遍历每个列表并将其全部推送到一个数组。
你可以使用这个 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()
连接成一个更大的数组,返回给调用者。
我实际上是在寻找 this answer 的 JavaScript 等价物,特别是在该响应中提供的第一种格式中。
换句话说,给定对象:
let variants = {
debug : ["on", "off"],
locale : ["de_DE", "en_US", "fr_FR"],
}
我想要一个 returns:
的函数[{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'}]
我正在寻找的解决方案应该不知道输入对象中有哪些键。
var debugCombs = [];
for(var debugVal in debug) {
for(var localeVal in locale) {
debugCombs.push({debug: debugVal, locale: localeVal});
}
}
我希望这是不言自明的:遍历每个列表并将其全部推送到一个数组。
你可以使用这个 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()
连接成一个更大的数组,返回给调用者。