javascript - JS : Dict of arrays combining by AND operation

标签 javascript angularjs

我使用 Angularjs。 我有下一个数据,例如:

let filters = {
                'async':[3,7],
                'gpu_freq':[400,500]
            };

有没有比很多循环更好的方法来获得以下组合?

[{
    'async': 3,
    'gpu_freq': 400
},{
    'async': 3,
    'gpu_freq': 50
},{
    'async': 7,
    'gpu_freq': 400
},{
    'async': 7,
    'gpu_freq': 500
}]

过滤器数量可以不同

最佳答案

如果包含对象的数组再次调用 getCartesian 并构建新对象,您可以通过迭代值来获得笛卡尔积。

这也适用于嵌套对象。

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var filters = { async: [3, 7], gpu_freq: [400, 500] },
    cartesian = getCartesian(filters);

console.log(cartesian);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - JS : Dict of arrays combining by AND operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52872713/

相关文章:

angularjs - bootstrap css 版本 3.3.2 未显示 Angular 引导模式背景

angularjs - 如何让 AngularJS 使用 ServiceStack FallbackRoute 属性来支持 HTML5 pushstate Urls?

javascript - Angular Catch 全局按键

angularjs - 如何使用satellizer在angularjs中获取经过身份验证的用户的电子邮件

javascript - ECMA-262 和 ECMA-357 之间有语法差异吗?

javascript - 使用 jQuery 单击时显示/隐藏 li 图标

javascript - 为什么 Node.js querystring.parse() 返回一个不是从 JavaScript `Object` 继承的对象?

javascript - 从多个数组唯一的元素创建一个新数组

javascript - 通过解构从数组中获取单个项目

javascript - 函数列表上的 typescript 映射