Javascript делает массивы равной длины с неизвестными данными и неизвестным количеством массивов

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть такой объект..

  data = [
// I'll never know how many objects are here, but the name will always be unique.
   {
    "name": "Junior",
    "data": [
 // I'll never know how many entries are here, but the first index will always be a date string and the value is the second index
      ["2021-01-02", 4],
      ["2021-01-06", 1],
      ["2021-01-08", 1]
    ]
  },
  {
    "name": "Adult",
    "data": [
      ["2021-01-02", 6],
      ["2021-01-05", 1],
      ["2021-01-06", 9],
      ["2021-01-07", 1],
     ]
  },
  {
    "name": "Playing",
    "data": [
      ["2021-01-06", 1]
    ]
  }
]
 

Что мне нужно сделать, так это убедиться, что каждое свойство данных одинаково, поэтому, если в одном свойстве отсутствует дата, оно должно быть добавлено к другим со значением 0, ожидаемый результат будет ниже;

 .. {
    name: "Junior"
    data: [
       ["2021-01-02", 4],
       ["2021-01-05", 0],
       ["2021-01-06", 1],
       ["2021-01-07", 0],
       ["2021-01-08", 1]
     ]
  },
{
   "name": "Adult",
   "data": [
     ["2021-01-02", 6],
     ["2021-01-05", 1],
     ["2021-01-06", 9],
     ["2021-01-07", 1],
     ["2021-01-08", 0]
   ]
 },
   {
     "name": "Playing",
     "data": [
        ["2021-01-02", 0],
        ["2021-01-05", 0],
        ["2021-01-06", 1],
        ["2021-01-07", 0],
        ["2021-01-08", 0]
      ]
    }
 

Любая помощь или идеи будут высоко оценены.

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

1. idownvotedbecau.se/noattempt

2. вам нужен новый массив? вы что-нибудь пробовали? что не работает?

Ответ №1:

Вы можете сначала получить Set уникальные месяцы, а затем применить map к фактическим данным:

 const data = [ { "name": "Junior", "data": [ ["2021-01-02", 4], ["2021-01-06", 1], ["2021-01-08", 1] ] }, { "name": "Adult", "data": [ ["2021-01-02", 6], ["2021-01-05", 1], ["2021-01-06", 9], ["2021-01-07", 1], ] }, { "name": "Playing", "data": [ ["2021-01-06", 1] ] }];

const allMonth = [...new Set(data.flatMap(o=>o.data.map(([date])=>date)))];

const result = data.map(o=>({...o, data:allMonth.map(i=>[i, Object.fromEntries(o.data)[i] || 0])}));

console.log(result); 

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

1. Что означают круглые скобки в последней строке: data.map(o=> ({...}) <--these here )

2. @Petyor Это оператор распространения. Вы можете прочитать об этом подробнее здесь developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…

3. Я имел в виду круглые скобки, а не оператор распространения. Я не знаком с этим синтаксисом: ({}) и что он делает

Ответ №2:

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

 const
    data = [{ name: "Junior", data: [["2021-01-02", 4], ["2021-01-06", 1], ["2021-01-08", 1]] }, { name: "Adult", data: [["2021-01-02", 6], ["2021-01-05", 1], ["2021-01-06", 9], ["2021-01-07", 1]] }, { name: "Playing", data: [["2021-01-06", 1]] }],
    temp = data.reduce((r, { name, data }) => {
        data.forEach(([date, value]) => (r[date] ??= {})[name] = value);
        return r;
    }, {}),
    dates = Object.keys(temp).sort(),
    result = data.map(({ name }) => ({ name, data: dates.map(date => [date, temp[date][name] || 0]) }));

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