У меня есть объект следующего вида (упрощенный тестовый пример ниже)декартово произведение яваскрипта свойств объекта
var test = {
shirts: {
sizes: ['large', 'medium']
,colors:['red', 'blue']
}
, trousers: {
type: ['formal', 'casual']
, pattern: ['plaid', 'stripes']
}
};
Я хочу, чтобы сгенерировать декартово произведение свойств, так что выход представляет собой массив из следующих форма:
// desired output
[ {shirts:{sizes:'large', color:'red'}, trousers:{type:'formal', pattern:'plaid'}}
,{shirts:{sizes:'large', color:'red'}, trousers:{type:'formal', pattern:'stripes'}}
,{shirts:{sizes:'large', color:'red'}, trousers:{type:'casual', pattern:'plaid'}}
, {shirts:{sizes:'large', color:'red'}, trousers:{type:'casual', pattern:'stripes'}}
,{shirts:{sizes:'large', color:'blue'}, trousers:{type:'formal', pattern:'plaid'}}
..... and so on ]
Как я могу это достичь? Я разработал следующий код (основанный на модификации кода для декартова продукта массива из другого сообщения SO), но, похоже, я завязываю себя в узлах, пытаясь заставить это работать.
function myCartesianProduct(input, current) {
if (!input) { return []; }
var head = input[Object.keys(input)[0]];
var tail = objSlice(input);
var output = [];
for (var key in head) {
for (var i = 0; i < head[key].length; i++) {
var newCurrent = copy(current);
newCurrent[key] = head[key][i];
if (Object.keys(tail).length) { //if tail.length
var productOfTail =
myCartesianProduct(tail, newCurrent);
output = output.concat(productOfTail);
} else {
output.push(newCurrent);
}
}
}
return output;
}
function objSlice(obj) {
var slicedObj = angular.copy(obj); // copy object using angularJs copy method
delete slicedObj[Object.keys(slicedObj)[0]]; //delete the first key
return slicedObj;
};
function copy(obj) {
var res = {};
for (var p in obj) res[p] = obj[p];
return res;
}
console.log(myCartesianProduct(test));
Заранее благодарим за помощь!
См. Http://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript – Paul
@Paul, этот случай отличается. Я видел другие сообщения на этом (и создал код на основе модификации), но есть разница в том, что в этом случае у нас есть свойства вложенных объектов, а не массив массивов. – Jarnal
Да, я думал, возможно, вы могли бы объединить Object.keys() на под-объектах с функцией для декартова произведения массивов в другом вопросе, а затем реструктурировать вывод из массива массивов в массив объектов, скажем 'map' – Paul