No creo que lo que quiero sea algo especial, simplemente no puedo entender cómo hacerlo. Tengo una gran variedad de objetos.

{   
    "year": 2016,
    "some stuff": "bla0",
    "other stuff": 20
},
    "year": 2017,
    "some stuff": "bla1",
    "other stuff": 21
},
    "year": 2016,
    "some stuff": "bla2",
    "other stuff": 22
}

Quiero crear la siguiente matriz de objetos a partir de lo anterior.

{
    "2016": [
        {
            "year": 2016,
            "some stuff": "bla0",
            "other stuff": 20
        },
        {
            "year": 2016,
            "some stuff": "bla2",
            "other stuff": 22
        }
    ],
    "2017": [
        {
            "year": 2017,
            "some stuff": "bla1",
            "other stuff": 21
        }
    ]
}

Mi código WIP actual está en https://codepen.io/sharperwebdev/pen/aqQQZy /? editors = 1011 las líneas JS pertinentes comienzan en 167. Se agradecería cualquier ayuda para aclarar mis ideas.

0
Sharper 1 mar. 2018 a las 18:26

5 respuestas

La mejor respuesta

Use la función reduce

var array = [{    "year": 2016,    "some stuff": "bla0",    "other stuff": 20  },  {    "year": 2017,    "some stuff": "bla1",    "other stuff": 21  },  {    "year": 2016,    "some stuff": "bla2",    "other stuff": 22  }]

var result = array.reduce((a, c) => {
  if (a[c.year]) a[c.year].push(c);
  else a[c.year] = [c];
  return a;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Ele 1 mar. 2018 a las 15:33
var objArray=[{   
    "year": 2016,
    "some stuff": "bla0",
    "other stuff": 20
},{
    "year": 2017,
    "some stuff": "bla1",
    "other stuff": 21
},{
    "year": 2016,
    "some stuff": "bla2",
    "other stuff": 22
}];
var newObjArray={};

objArray.forEach(function(item){
var year=item.year;
  if(!newObjArray.hasOwnProperty(year)){
    newObjArray[year]=[item];
  }else{
    newObjArray[year].push(item);
  }
});
console.log(newObjArray);
1
Mr.Bruno 1 mar. 2018 a las 15:35

¿Desea agrupar su conjunto de objetos por año? Puedes hacer algo como:

const data = [{   
  "year": 2016,
  "some stuff": "bla0",
  "other stuff": 20
}, {
  "year": 2017,
  "some stuff": "bla1",
  "other stuff": 21
}, {
  "year": 2016,
  "some stuff": "bla2",
  "other stuff": 22
}];

function groupBy(data, key) {
  return data.reduce((result, item) => {
    result[item[key]] = result[item[key]] || [];
    result[item[key]].push(item);
    return result;
  }, {});
}

groupBy(data, 'year');

Demostración de jsbin: http://jsbin.com/jifozivuve/edit?js,console

1
Vic 1 mar. 2018 a las 15:33

Puede realizar un bucle de la matriz existente con forEach y agregar el año como clave para un nuevo objeto.

var oldArr = [{
  "year": 2016,
  "some stuff": "bla0",
  "other stuff": 20
}, {
  "year": 2017,
  "some stuff": "bla1",
  "other stuff": 21
}, {
  "year": 2016,
  "some stuff": "bla2",
  "other stuff": 22
}]

var newObj = {};
oldArr.forEach(function(item) {
  if (newObj.hasOwnProperty(item.year)) {
    newObj[item.year].push(item)
  } else {
    newObj[item.year] = [];
    newObj[item.year].push(item)
  }
});
console.log(newObj)
I want to create the following array of objects from the above.
1
brk 1 mar. 2018 a las 15:35

Para lograr el resultado esperado, use la siguiente opción de usar el mapa

var x = [{   
    "year": 2016,
    "some stuff": "bla0",
    "other stuff": 20
},{
    "year": 2017,
    "some stuff": "bla1",
    "other stuff": 21
},{
    "year": 2016,
    "some stuff": "bla2",
    "other stuff": 22
}]

var y =[]
x.map(function(e){
  var temp ={}
  temp[e.year] = e
  y.push(temp)
})

console.log(y)

https://codepen.io/nagasai/pen/yvZdQY

1
Naga Sai A 1 mar. 2018 a las 15:49