如何从对象创建多维对象?

时间:2018-04-16 13:11:00

标签: javascript arrays json object

我有一个对象将其框架为二维对象。

var data = {'id':1, 'price':'12', 'price_type':'abc', 'mode':1, 'year':1},
            {'id':1, 'price':'22', 'price_type':'def', 'mode':1, 'year':1},
            {'id':1, 'price':'15', 'price_type':'abc', 'mode':1, 'year':2},
            {'id':1, 'price':'32', 'price_type':'def', 'mode':1, 'year':2},
            {'id':1, 'price':'30', 'price_type':'abc', 'mode':1, 'year':3},
            {'id':1, 'price':'35', 'price_type':'def', 'mode':1, 'year':3}

结果应为{mode:{year:{'abc_price':price1, def_price:price2}}

例如:

 results = {
             1:{
                1:{'abc_price':12, def_price:22},
                2:{'abc_price':15, def_price:32},
                3:{'abc_price':30, def_price:35}
              } 
            }

我们怎样才能从我给出的对象中获得上述结果? 请帮帮我。

我尝试了以下内容,

var tmpArr = [];
var objArr = {};

for(var i = 0; i < data.length; i++) {
        objArr[data[i].mode][data[i].year] = {'mode': data[i].mode, 'year': data[i].year};
         if(data[i].price_type == "abc") {
              objArr[data[i].mode][data[i].year]['abc_price'] = data[i].price;
        }
        if(data[i].price_type == "def") {
             objArr[data[i].mode][data[i].year]['def_price'] = data[i].price;
        }
      tmpArr.push(objArr);
}

console.log("temp Array: "+ JSON.stringify(tmpArr));

我在二维数组中得到了未定义索引值的错误。

3 个答案:

答案 0 :(得分:0)

另一种方法是使用函数reduce对对象进行分组。

var obj_sample = [{    'id': 1,    'price': '12',    'price_type': 'abc',    'mode': 1,    'year': 1  },  {    'id': 1,    'price': '22',    'price_type': 'def',    'mode': 1,    'year': 1  },  {    'id': 1,    'price': '15',    'price_type': 'abc',    'mode': 1,    'year': 2  },  {    'id': 1,    'price': '32',    'price_type': 'def',    'mode': 1,    'year': 2  },  {    'id': 1,    'price': '30',    'price_type': 'abc',    'mode': 1,    'year': 3  },  {    'id': 1,    'price': '35',    'price_type': 'def',    'mode': 1,    'year': 3  }],
    results = obj_sample.reduce((a, {mode, year, price, price_type}) => {
      a[mode] = (a[mode] || {});
      a[mode][year] = (a[mode][year] || {});  
      a[mode][year][`${price_type}_price`] = price;  
      return a;
    }, {});

console.log(results);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您可以迭代对象和所需键的数组以进行分组,并将price值分配给新对象。

var objects = [{ id: 1, price: '12', price_type: 'abc', mode: 1, year: 1 }, { id: 1, price: '22', price_type: 'def', mode: 1, year: 1 }, { id: 1, price: '15', price_type: 'abc', mode: 1, year: 2 }, { id: 1, price: '32', price_type: 'def', mode: 1, year: 2 }, { id: 1, price: '30', price_type: 'abc', mode: 1, year: 3 }, { id: 1, price: '35', price_type: 'def', mode: 1, year: 3 }],
    groups = ['mode', 'year'],
    result = objects.reduce((r, o) => {
        groups.reduce(
            (t, k) => t[o[k]] = t[o[k]] || {},
            r
        )[o.price_type + '_price'] = o.price;
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您的示例数据不正确JSON,我猜是数组。检查以下解决方案:

obj_sample = [{'id':1, 'price':'12', 'price_type':'abc', 'mode':1, 'year':1},
        {'id':1, 'price':'22', 'price_type':'def', 'mode':1, 'year':1},
        {'id':1, 'price':'15', 'price_type':'abc', 'mode':1, 'year':2},
        {'id':1, 'price':'32', 'price_type':'def', 'mode':1, 'year':2},
        {'id':1, 'price':'30', 'price_type':'abc', 'mode':1, 'year':3},
        {'id':1, 'price':'35', 'price_type':'def', 'mode':1, 'year':3}]
let resultObj = {};
obj_sample.forEach(obj => {
    resultObj[obj.mode] = resultObj[obj.mode] || {};
    resultObj[obj.mode][obj.year] = resultObj[obj.mode][obj.year] || {};
    resultObj[obj.mode][obj.year][`${obj.price_type}_price`] = obj.price;
});
console.log(resultObj);