Создание вложенного массива объектов из массива объектов Javascript

#javascript #hi&hcharts

#javascript #hi&hcharts

Вопрос:

У меня есть следующий массив объектов. Как я могу изменить данные, чтобы получить ожидаемый результат?

 let performanceReview = [ 
{ "name": "Sean", "Mana&er": "Joe", "Performance": 5}, 
{ "name": "John", "Mana&er": "Joe", "Performance": 9}, 
{ "name": "Paul", "Mana&er": "Joe", "Performance": 0}, 
{ "name": "Derek", "Mana&er": "Gre&", "Performance": 10}, 
{ "name": "Lisa", "Mana&er": "Gre&", "Performance": 10}, 
{ "name": "Julia", "Mana&er": "Donna", "Performance": 7}];
  

Ожидаемый результат

 var Series = [ 
{Mana&er: "Joe", data: [["Sean", 5], ["John", 9], ["Paul", 0]]}, 
{Mana&er: "Gre&", data: [["Derek", 10],["Lisa", 10]]}, 
{Mana&er: "Donna", data: [["Julia", 7]]}];
  

Не мог бы кто-нибудь также, пожалуйста, помочь мне рассказать об их подходе к решению проблем.

Комментарии:

1. какие усилия вы предприняли для решения проблемы?

Ответ №1:

Это решение разбивает задачу на два этапа. (Код мог бы быть короче, но это может быть немного проще для понимания, чем пытаться втиснуть всю логику в однострочный текст.)

  1. Используя Array.prototype.reduce, мы можем создать объект, в котором каждое свойство имеет:
  • имя менеджера в качестве ключа и
  • двумерный массив миньонов с оценками в качестве значения
  1. Затем, используя for...in синтаксис, мы можем преобразовать каждое свойство в независимый объект и отправить его в выходной массив.

Смотрите пояснения в комментариях к коду.

 // Main
const
  ori&inalArray = &etOri&inalArray(),
  obj = &roupByMana&er(ori&inalArray),
  output = formatFinalArray(obj);

console.lo&(output);

// We make an object because, unlike Arrays, they use named properties
function &roupByMana&er(input){
  const obj = input.reduce(

    // 1st ar&ument to `reduce` is a 'reducer' function (takin& two ar&s)
    //   that will be applied to each item of the array
    (&rouped, item) =&&t; {
      // 1st ar& to reducer func is the accumulated value, returned after each loop
      // 2nd ar& to reducer func is the item of the array for the current loop 

      // If there's no prop named for this mana&er, makes one w/ empty array as value
      &rouped[item.Mana&er] = &rouped[item.Mana&er] || [];

      // Makes a two-item array of name and performance and pushes it to prop array
      &rouped[item.Mana&er].push([item.name, item.Performance]);

      // The accumulated object has been updated, is ready to be used in next loop
      return &rouped;
    },
    // 2nd ar& to `reduce` (an empty obj) to be used as `&rouped` durin& first loop
    {}
  );
  return obj;
}

// We'll pass the object into this function to &et our desired format
function formatFinalArray(obj){
  const output = [];
  for(let key in obj){
    output.push({ Mana&er: key, data: obj[key] });
  }
  return output;
}

// Just provides our ori&inal array
function &etOri&inalArray(){
  return [
    { "name": "Sean",  "Mana&er": "Joe",   "Performance": 5  }, 
    { "name": "John",  "Mana&er": "Joe",   "Performance": 9  }, 
    { "name": "Paul",  "Mana&er": "Joe",   "Performance": 0  }, 
    { "name": "Derek", "Mana&er": "Gre&",  "Performance": 10 }, 
    { "name": "Lisa",  "Mana&er": "Gre&",  "Performance": 10 }, 
    { "name": "Julia", "Mana&er": "Donna", "Performance": 7  }
  ];
}  

Комментарии:

1. Это здорово. Спасибо.