Передача данных из этого массива в другой использует наименьший цикл

#javascript

#javascript

Вопрос:

Я хочу преобразовать данные из массива ‘data2’ в массив ‘dataConvert’, и я хочу найти другой способ оптимизации.

 let dataConvert = [];

data2 = [
{
    time: "2020-7",
    tasks: [
      {
        key: "p1",
        value: 15
      },
      {
        key: "p2",
        value: 13
      },
    ]
  },
{
    time: "2020-8",
    tasks: [
      {
        key: "p1",
        value: 16
      },
      {
        key: "p2",
        value: 19
      },
    ]
  },
{
    time: "2020-9",
    tasks: [
      {
        key: "p1",
        value: 12
      },
      {
        key: "p2",
        value: 93
      },
    ]
  }
]

  

После добавления данных в массив ‘dataConvert’, затем ‘dataConvert’ форматируется следующим образом:

 dataConvert = [
  ["x","2020-7", "2020-8", "2020-9"],
  ["p1", 15, 16, 12],
  ["p2", 13, 19, 93]
]

  

я пробовал использовать reduce , я хочу найти другой способ оптимизации.

 let dateConvert = [], valueConvert = [];
data2.forEach(x=>{
   let date = new Date(x.time);
   if (date) {
      let getYear = date.getFullYear();
      let getMonth = date.getMonth()   1;
      let newDate = `${getYear}-${getMonth}-1`;
      return dateConvert = [...dateConvert, newDate];
   }
})
dateConvert.unshift("x");

// get p1 p2 value
let allTasks = data2.flatMap(x => x.tasks);

 valueConvert = Object.values(allTasks.reduce((arr, item) => {
 arr[item.key] = arr[item.key] || [item.key];
 arr[item.key].push(item.value);
 return arr;
}, {}));
dataConvert = [...[dateConvert], ...valueConvert];
  

спасибо тебе.

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

1. Разве вы не задавали тот же вопрос несколько часов назад?

2. @Barmar Вопрос был закрыт, и никто не ответил

3. Я проголосовал за повторное открытие его, когда вы добавили свой код. Вы должны быть более терпеливыми.

4. Если код работает и вы ищете совет по его улучшению, то Code Review — подходящее место. Но смотрите codereview.meta.stackexchange.com/questions/5777 /… сначала.

Ответ №1:

Вы могли бы использовать вложенные циклы и сохранять индекс в объекте для более быстрого доступа к key .

 const
    data = [{ time: "2020-7", tasks: [{ key: "p1", value: 15 }, { key: "p2", value: 13 }] }, { time: "2020-8", tasks: [{ key: "p1", value: 16 }, { key: "p2", value: 19 }] }, { time: "2020-9", tasks: [{ key: "p1", value: 12 }, { key: "p2",value: 93 }] }],
    dataConvert = [['x']],
    indices = {};

data.forEach(o => {
    dataConvert[0].push(o.time);
    o.tasks.forEach(({ key, value }) => {
        if (!(key in indices)) indices[key] = dataConvert.push([key]) - 1;
        dataConvert[indices[key]].push(value);
    });
});

console.log(dataConvert);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }