J'ai un objet pour l'encadrer comme un objet bidimensionnel.

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}

Les résultats doivent être, {mode:{year:{'abc_price':price1, def_price:price2}}

Ex:

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

Comment pouvons-nous obtenir les résultats ci-dessus à partir de l'objet que j'ai donné? Aidez-moi, s'il vous plaît.

J'ai essayé comme suit,

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

J'ai eu une erreur pour une valeur d'index non définie dans un tableau à deux dimensions.

0
Ramesh Moorthy 16 avril 2018 à 16:11

3 réponses

Meilleure réponse

Une alternative consiste à utiliser la fonction reduce pour regrouper les objets.

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; }
0
Ele 16 avril 2018 à 13:30

Vous pouvez parcourir les objets et un tableau des clés souhaitées pour le regroupement et affecter la valeur price à un nouvel objet.

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; }
0
Nina Scholz 16 avril 2018 à 13:28

Vos données d'exemple ne sont pas correctes JSON, ce serait un tableau je suppose. vérifiez la solution suivante:

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);
0
Anshuman Jaiswal 16 avril 2018 à 13:39