【问题标题】:combine multidimensional array into key based dictionary object将多维数组组合成基于键的字典对象
【发布时间】:2014-05-25 02:21:16
【问题描述】:

我正在尝试根据产品的颜色、尺寸和材料为其创建价格模式。 我目前的实现方式是维护 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
        }
      }
    }
  },
  ....

]

所以我可以做类似 price["red"]["S"]["leather"] 的操作来获取红色、皮革、小尺寸的价格。 有简单的方法吗?在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};
    });
  }
};

【问题讨论】:

  • 数据从何而来,即(例如)[red][S][leather] 的值从何而来?
  • @JayanthKoushik 如果您参考我们手动输入的成本和可用性信息。

标签: javascript python arrays list dictionary


【解决方案1】:

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

【讨论】:

  • +1 表示 productzip,但不能更清楚地完成循环内的所有内容:result.append({col: {siz: {mat: {'available': True, 'cost': 100}}}})
  • @FMc Brilliant...谢谢伙计:)我把它包括在答案中:)
  • @thefourtheye,是否有可能有 Javascript 版本?
  • 感谢您的帮助。
  • @thefourtheye 最后一个问题,如果选项是动态的怎么办?表示如果我们不提前知道 productionOption 数组中的键(颜色、尺寸、材质)是什么。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多