Me preguntaba si hay una manera de dividir pares de objetos clave / valor e insertarlos en una matriz para obtener una matriz de objetos.

Aquí está el código:

let grades = [5,5,6,7,6,7,9,10,8,6]

let gradesSpread = {
   5:0,
   6:0,
   7:0,
   8:0,
   9:0,
   10:0
}


// This populates spreadGrades object as intended
for( let [index,grade] in grades.entries() ) {
   gradesSpread[grade]++
}

Entonces ahora quiero obtener un par clave / valor de gradesSpread y crear un objeto para cada uno y empujarlo a una nueva matriz.

Sé que puedo usar Object.values() y Object.keys() para obtener claves o valores del objeto, pero no tengo idea de cómo agregaría esos pares de valores clave en una matriz de objetos

Para una mejor visualización, necesito una matriz que se vea así:

let finalSpread = [{5:0},{6:4}...]

Estoy abierto a todas las soluciones y también a puntos de bonificación por hacerlo de modo que no necesite un objeto inicializado.

2
ukaric 28 oct. 2017 a las 21:40

4 respuestas

La mejor respuesta

Suena como si quisieras {{ X0}}.

let grades = [5,5,6,7,6,7,9,10,8,6];

let finalSpread = grades.reduce((spread, grade) => {
  let count = spread[grade] || 0;
  spread[grade] = ++count;
  return spread;
}, {});

Al ver que desea un valor final que sea esencialmente un mapa de valores-clave, recomendaría finalSpread ser un objeto como el anterior.



Actualización:

Si es imperativo que sea una matriz por cualquier razón que pueda:

A. Agregue finalSpread = Object.entries(finalSpread) al final (nota: cada calificación será en realidad una cadena)

Si. Simplemente refactorice la función en reduce para verificar si la matriz de [grade, count] ya existe y agréguela o increméntela.

C. use un Mapa en lugar de una matriz como el acumulador de reducción (si necesita que las calificaciones también sean números, el mapa permite claves que no sean cadenas), luego póngalo en una matriz, es decir:

let finalSpread = grades.reduce((spread, grade) => {
  let count = spread.get(grade) || 0;
  spread.set(grade, ++count);
  return spread;
}, new Map());
finalSpread = Array.from(finalSpread);

(nota: map y Array.from() tienen compatibilidad limitada con el navegador)

1
SamVK 28 oct. 2017 a las 19:25

Puede asignar las claves con los valores. El orden no refleja el orden de inserción del objeto.

var object = { 5: 1, 6: 3, 2: 4 },
    result = Object
        .keys(object)
        .map(k => ({ [k]: object[k] }));
    
console.log(result);
2
Nina Scholz 28 oct. 2017 a las 18:49

También puedes probar:

let arrayOfObj = [];
let extractPairs = (jsonObj) => {
for(let item in jsonObj) {
    console.log(item);
    arrayOfObj.push({item: jsonObj[item]})
}
console.log(arrayOfObj);
}
0
Vishal Kaul 28 oct. 2017 a las 20:01
var arr = [];
Object.keys(grades).forEach((key) => {
    var newObj = {};
    newObj[key] = grades[key];
    arr.push(newObj);
});

El uso de ES6 podría ser más corto:

var arr = [];
Object.keys(grades).forEach((key) => {
    arr.push({[key]: grades[key});
});
3
Nachshon Schwartz 28 oct. 2017 a las 18:51