#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; }