JS: Dict объединения массивов операцией AND - PullRequest
0 голосов
/ 18 октября 2018

я использую 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
}]

Количество фильтров может быть различным

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете получить декартово произведение, повторяя значения, если массив с объектами снова вызывает 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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...