如何在 JavaScript 中创建此对象的键/值的所有组合? [英] How can I create all combinations of this object's keys/values in JavaScript?

查看:37
本文介绍了如何在 JavaScript 中创建此对象的键/值的所有组合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 JavaScript 对象结构:

var 选项 = {选项一:[真,假],选项二:[真,假],选项三:[空值,{属性1:9,属性2:7},{属性1:4,属性2:12},{属性1:16,属性2:14}]};

请注意,此对象中的密钥/对的数量会有所不同.所以实际上可能有 optionFouroptionFive 等,并且每个选项的数组可以有任意数量或类型的值.

我需要遍历这个对象并创建一个包含所有可能选项组合的对象的数组:

<预><代码>[{optionOne: true, optionTwo, true, optionThree: null},{optionOne: false, optionTwo, true, optionThree: null},{optionOne: true, optionTwo, false, optionThree: null},{optionOne: false, optionTwo, false, optionThree: null},{optionOne: true, optionTwo, true, optionThree: {property1: 9, property2: 7}},{optionOne: false, optionTwo, true, optionThree: {property1: 9, property2: 7}},{optionOne: true, optionTwo, false, optionThree: {property1: 9, property2: 7}},{optionOne: false, optionTwo, false, optionThree: {property1: 9, property2: 7}},{optionOne: true, optionTwo, true, optionThree: {property1: 4, property2: 12}},{optionOne: false, optionTwo, true, optionThree: {property1: 4, property2: 12}},{optionOne: true, optionTwo, false, optionThree: {property1: 4, property2: 12}},{optionOne: false, optionTwo, false, optionThree: {property1: 4, property2: 12}},{optionOne: true, optionTwo, true, optionThree: {property1: 16, property2: 14}},{optionOne: false, optionTwo, true, optionThree: {property1: 16, property2: 14}},{optionOne: true, optionTwo, false, optionThree: {property1: 16, property2: 14}},{optionOne: false, optionTwo, false, optionThree: {property1: 16, property2: 14}}]

我正在努力研究如何实现这一点,但我相当有信心答案在于递归.

算法大神能帮帮我吗?

解决方案

function getCombinations(options, optionIndex, results, current) {var allKeys = Object.keys(options);var optionKey = allKeys[optionIndex];var vals = options[optionKey];for (var i = 0; i < vals.length; i++) {当前[optionKey] = vals[i];if (optionIndex + 1 < allKeys.length) {getCombinations(options, optionIndex + 1, results, current);} 别的 {//克隆对象的最简单方法.var res = JSON.parse(JSON.stringify(current));结果.推(res);}}返回结果;}

像这样使用它:

var results = getCombinations(options, 0, [], {});

这是一个有效的 JSFiddle 示例.

I have the following JavaScript object structure:

var options = {
    optionOne: [true, false],
    optionTwo: [true, false],
    optionThree: [
        null,
        {property1: 9, property2: 7},
        {property1: 4, property2: 12},
        {property1: 16, property2: 14}
    ]
};

Please note that the number of key/pairs in this object will differ. So there might actually be optionFour, optionFive, etc., and each option can have any number or type of values for its array.

I need to iterate through this object and create an array containing objects of all possible option combinations:

[
    {optionOne: true,  optionTwo, true,  optionThree: null},
    {optionOne: false, optionTwo, true,  optionThree: null},
    {optionOne: true,  optionTwo, false, optionThree: null},
    {optionOne: false, optionTwo, false, optionThree: null},
    {optionOne: true,  optionTwo, true,  optionThree: {property1: 9, property2: 7}},
    {optionOne: false, optionTwo, true,  optionThree: {property1: 9, property2: 7}},
    {optionOne: true,  optionTwo, false, optionThree: {property1: 9, property2: 7}},
    {optionOne: false, optionTwo, false, optionThree: {property1: 9, property2: 7}},
    {optionOne: true,  optionTwo, true,  optionThree: {property1: 4, property2: 12}},
    {optionOne: false, optionTwo, true,  optionThree: {property1: 4, property2: 12}},
    {optionOne: true,  optionTwo, false, optionThree: {property1: 4, property2: 12}},
    {optionOne: false, optionTwo, false, optionThree: {property1: 4, property2: 12}},
    {optionOne: true,  optionTwo, true,  optionThree: {property1: 16, property2: 14}},
    {optionOne: false, optionTwo, true,  optionThree: {property1: 16, property2: 14}},
    {optionOne: true,  optionTwo, false, optionThree: {property1: 16, property2: 14}},
    {optionOne: false, optionTwo, false, optionThree: {property1: 16, property2: 14}}
]

I'm struggling on how to accomplish this but am fairly confident the answer lies in recursion.

Can the algorithm gods help me?

解决方案

function getCombinations(options, optionIndex, results, current) {
    var allKeys = Object.keys(options);
    var optionKey = allKeys[optionIndex];

    var vals = options[optionKey];

    for (var i = 0; i < vals.length; i++) {
        current[optionKey] = vals[i];

        if (optionIndex + 1 < allKeys.length) {
            getCombinations(options, optionIndex + 1, results, current);
        } else {
            // The easiest way to clone an object.
            var res = JSON.parse(JSON.stringify(current));
            results.push(res);
        }
    }

    return results;
}

Use it like this:

var results = getCombinations(options, 0, [], {});

Here's a working JSFiddle example.

这篇关于如何在 JavaScript 中创建此对象的键/值的所有组合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆