【问题标题】:All combinations of of an object with array values for its keys对象与其键的数组值的所有组合
【发布时间】:2017-08-20 16:50:10
【问题描述】:

我实际上是在寻找 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'}]

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

【问题讨论】:

    标签: javascript data-structures combinatorics


    【解决方案1】:

    你可以使用这个 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 会参与其中。谢谢!
    【解决方案2】:
    var debugCombs = [];
    for(var debugVal in debug) {
        for(var localeVal in locale) {
             debugCombs.push({debug: debugVal, locale: localeVal});
        }
    }
    

    我希望这是不言自明的:遍历每个列表并将其全部推送到一个数组中。

    【讨论】:

    • 应该让我的问题更清楚——解决方案无法知道原始对象中有哪些键。
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多