I ein Objekt der folgenden Form haben (vereinfachte Testfall unten)kartesisches Produkt von JavaScript-Objekteigenschaften
var test = {
shirts: {
sizes: ['large', 'medium']
,colors:['red', 'blue']
}
, trousers: {
type: ['formal', 'casual']
, pattern: ['plaid', 'stripes']
}
};
I ein kartesisches Produkt der Eigenschaften erzeugt werden soll, so dass der Ausgang ein Array der folgenden ist form:
// 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 ]
Wie kann ich das erreichen? Ich habe den folgenden Code ausgearbeitet (basierend auf einer Modifikation des Codes für das kartesische Produkt des Arrays von einem anderen SO-Post), aber ich scheine mich in Knoten zu verknoten, um das zum Laufen zu bringen.
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));
Vielen Dank im Voraus für Ihre Hilfe mit diesem!
Siehe http://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript – Paul
@Paul, dieser Fall ist anders. Ich habe die anderen Beiträge dazu gesehen (und den Code basierend auf einer Modifikation erstellt), aber es gibt einen Unterschied darin, dass wir in diesem Fall Objekteigenschaften im Gegensatz zu Arrays von Arrays verschachtelt haben. – Jarnal
Ja, ich dachte, Sie könnten vielleicht Object.keys() auf Unterobjekte mit der Funktion für kartesisches Produkt von Arrays in der anderen Frage kombinieren und dann die Ausgabe von einem Array von Arrays zu einem Array von Objekten restrukturieren, mit sag 'map' – Paul