Разделить пары ключ / значение объекта на отдельные объекты

1

Мне было интересно, есть ли способ разделить пары ключ/значение объектов и вставить их в массив, чтобы получить массив объектов.

Вот код:

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}...]

Я открыт для всех решений, а также бонусные баллы для его создания, чтобы он не нуждался в инициализированном объекте.

  • 0
    Где эта 4 приближающаяся форма ?: {6:4}...]
  • 0
    Это пример, а не отражение данных в вопросе.
Показать ещё 2 комментария
Теги:
ecmascript-6
arrays

4 ответа

1
Лучший ответ

Похоже, вы хотите 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() имеют ограниченную поддержку браузера.)

  • 0
    На самом деле использование Map качестве начального значения в качестве аккумулятора блестяще. Это решает множество проблем.
3
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});
});
  • 0
    Получает ключи, но не значения для соответствующих ключей.
  • 0
    o [ключ] - это значение, я изменил его на оценки [ключ [, чтобы сделать его более понятным
2

Вы можете сопоставить ключи со значениями. Порядок не отражает порядок вставки объекта.

var object = { 5: 1, 6: 3, 2: 4 },
    result = Object
        .keys(object)
        .map(k => ({ [k]: object[k] }));
    
console.log(result);
  • 0
    И мне было интересно, почему я не могу наложить карту на объект в течение часа, забыв, что вы можете отображать массивы, а не объект. Спасибо, это довольно краткое решение, могу ли я спросить, как бы вы пошли о сортировке окончательного массива по значению ключа?
  • 0
    какой заказ вам нужен?
Показать ещё 2 комментария
0

Вы также можете попробовать:

let arrayOfObj = [];
let extractPairs = (jsonObj) => {
for(let item in jsonObj) {
    console.log(item);
    arrayOfObj.push({item: jsonObj[item]})
}
console.log(arrayOfObj);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню