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

标签 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'}]

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

最佳答案

你可以使用这个 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() 连接成一个更大的数组,返回给调用者。

关于javascript - 对象及其键的数组值的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43055569/

相关文章:

javascript - 什么是将内容附加到链接 URL 的更简洁的方法?

javascript - 对于 svg :text element in Firefox 15,宽度似乎始终为零(或 NaN)

delphi - 访问存储在另一个单元Delphi中的数据

Haskell - 列表列表中的元素组合列表

algorithm - 计算词典排名

c# - 如何获得一组可复制元素的所有唯一 n 长组合?

javascript - 使用knockoutjs禁用绑定(bind)

JavaScript 闭包和范围问题

c++ - 如果同一数据位于不同的数据结构中,则维护它们的两个拷贝是否是一种不好的做法?

algorithm - 颠倒单词的顺序——时间复杂度?