我有一个对象将其框架为二维对象。
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));
我在二维数组中得到了未定义索引值的错误。
答案 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);