Мне было интересно, есть ли способ разделить пары ключ/значение объектов и вставить их в массив, чтобы получить массив объектов.
Вот код:
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]++
}
Поэтому теперь я хочу получить пару ключ/значение из gradesSpread
и создать объект для каждого и gradesSpread
его в новый массив.
Я знаю, что я могу использовать Object.values()
и Object.keys()
для получения ключей или значений из объекта, но я не знаю, как бы я хотел добавить эти пары значений ключей в массив объектов
Для лучшей визуализации мне нужен массив, чтобы выглядеть примерно так:
let finalSpread = [{5:0},{6:4}...]
Я открыт для всех решений, а также бонусные баллы для его создания, чтобы он не нуждался в инициализированном объекте.
Похоже, вы хотите Array.prototype.reduce()
.
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;
}, {});
Видя, как вы хотите получить окончательное значение, которое по существу представляет собой карту значений ключа, я бы рекомендовал finalSpread
быть объектом, как указано выше.
Обновить:
Если необходимо, чтобы это был массив по любой причине, вы могли:
а. Добавить finalSpread = Object.entries(finalSpread)
в конце (примечание: каждый класс будет фактически строкой)
б. Просто переформатируйте функцию в сворачивании, чтобы проверить, существует ли массив из [grade, count] и добавляет его или увеличивает его.
с. используйте карту вместо массива в качестве накопителя уменьшения (если вам нужны оценки, которые также должны быть числами - Map позволяет использовать нестрочные ключи) - затем переведите его в массив, то есть:
let finalSpread = grades.reduce((spread, grade) => {
let count = spread.get(grade) || 0;
spread.set(grade, ++count);
return spread;
}, new Map());
finalSpread = Array.from(finalSpread);
(note: map
и Array.from()
имеют ограниченную поддержку браузера.)
Map
качестве начального значения в качестве аккумулятора блестяще. Это решает множество проблем.
var arr = [];
Object.keys(grades).forEach((key) => {
var newObj = {};
newObj[key] = grades[key];
arr.push(newObj);
});
Используя ES6, он может быть короче:
var arr = [];
Object.keys(grades).forEach((key) => {
arr.push({[key]: grades[key});
});
Вы можете сопоставить ключи со значениями. Порядок не отражает порядок вставки объекта.
var object = { 5: 1, 6: 3, 2: 4 },
result = Object
.keys(object)
.map(k => ({ [k]: object[k] }));
console.log(result);
Вы также можете попробовать:
let arrayOfObj = [];
let extractPairs = (jsonObj) => {
for(let item in jsonObj) {
console.log(item);
arrayOfObj.push({item: jsonObj[item]})
}
console.log(arrayOfObj);
}
{6:4}...]