gpt4 book ai didi

javascript - javascript对象属性的笛卡尔积

转载 作者:数据小太阳 更新时间:2023-10-29 05:12:25 32 4
gpt4 key购买 nike

我有一个以下形式的对象(下面的简化测试用例)

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));

在此先感谢您的帮助!

最佳答案

好的,让我们从生成给定数组乘积的函数开始:

function product(args) {
if(!args.length)
return [[]];
var prod = product(args.slice(1)), r = [];
args[0].forEach(function(x) {
prod.forEach(function(p) {
r.push([x].concat(p));
});
});
return r;
}

下一个使用 product{a:[1,2], b:[3,4]} 转换为 [{a :1,b:3},{a:1,b:4},{a:2,b:3},{a:2,b:4}]:

function objectProduct(obj) {
var keys = Object.keys(obj),
values = keys.map(function(x) { return obj[x] });

return product(values).map(function(p) {
var e = {};
keys.forEach(function(k, n) { e[k] = p[n] });
return e;
});
}

对于您的测试数据,您必须应用它两次:

var result = {};
Object.keys(test).forEach(function(k) {
result[k] = objectProduct(test[k])
});

result = objectProduct(result);

这会为您提供所需的输出。

关于javascript - javascript对象属性的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697737/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com