我正在尝试根据产品的颜色,尺寸和材料为产品创建价格架构。 我目前的实现方式是维护1个JSON对象,该对象包含所有选项,并尝试使用其所有可能的选项组合生成另一个JSON对象。 例如
var productOption = {
"color":["red","green","yellow"],
"size":["S","M","L"],
"material":["leather","linen"]
}
what I want to create something like follow
[
{
"red":{
"S":{
"leather":{
"cost":100,"available":true
}
}
}
},
{
"green":{
"S":{
"leather":{
"cost":100,"available":true
}
}
}
},
....
]
所以我可以做一些像价格[“红色”] [“S”] [“皮革”]的东西,以获得红色,皮革,小尺寸的价格。 有一个简单的方法吗?无论是在Javascript还是Python中。
修改
如果某些产品只有颜色,尺寸或颜色,该怎么办?
var productOption= { color :[...],size:[...]};
编辑2:
我编写了以下代码来解决我的问题。如果您对如何改进我的代码有任何建议。请告诉我。
// I am using lodash for those underscore signs.
var processPrice = function(){
price = {};
var keys = _.keys(_.pick(priceOption,function(value,key){
return !_.isEmpty(value);
}));
if(keys.length>0){
genMatrix(keys,[],price);
}
};
var genMatrix = function(keys,options,obj){
var key = keys[0];
if(keys.length>1){
var subKeys = _.compact(keys);
subKeys.shift();
_.each(priceOption[key],function(opt){
var subOption = _.compact(options);
subOption.push(opt.value);
obj[opt.value]={};
genMatrix(subKeys,subOption,obj[opt.value]);
});
}else{
_.each(priceOption[key],function(opt){
obj[opt.value]={cost: 100, available: true};
});
}
};
答案 0 :(得分:4)
Python版
from itertools import product
result = []
for col, siz, mat in product(*(data["color"], data["size"], data["material"])):
result.append({col: {siz: {mat: {'available': True, 'cost': 100}}}})
print result
<强>输出强>
[{'red': {'S': {'leather': {'available': True, 'cost': 100}}}},
{'red': {'S': {'linen': {'available': True, 'cost': 100}}}},
{'red': {'M': {'leather': {'available': True, 'cost': 100}}}},
{'red': {'M': {'linen': {'available': True, 'cost': 100}}}},
{'red': {'L': {'leather': {'available': True, 'cost': 100}}}},
{'red': {'L': {'linen': {'available': True, 'cost': 100}}}},
{'green': {'S': {'leather': {'available': True, 'cost': 100}}}},
{'green': {'S': {'linen': {'available': True, 'cost': 100}}}},
{'green': {'M': {'leather': {'available': True, 'cost': 100}}}},
{'green': {'M': {'linen': {'available': True, 'cost': 100}}}},
{'green': {'L': {'leather': {'available': True, 'cost': 100}}}},
{'green': {'L': {'linen': {'available': True, 'cost': 100}}}},
{'yellow': {'S': {'leather': {'available': True, 'cost': 100}}}},
{'yellow': {'S': {'linen': {'available': True, 'cost': 100}}}},
{'yellow': {'M': {'leather': {'available': True, 'cost': 100}}}},
{'yellow': {'M': {'linen': {'available': True, 'cost': 100}}}},
{'yellow': {'L': {'leather': {'available': True, 'cost': 100}}}},
{'yellow': {'L': {'linen': {'available': True, 'cost': 100}}}}]
JavaScript版本:
var result = [];
for (var i = 0; i < data["color"].length; i += 1) {
var color = data["color"][i];
for (var j = 0; j < data["size"].length; j += 1) {
var size = data["size"][j];
for (var k = 0; k < data["material"].length; k += 1) {
var material = data["material"][k], obj = {};
obj[color] = {};
obj[color][size] = {};
obj[color][size][material] = {cost: 100, available: true};
result.push(obj);
}
}
}
console.log(result);