Получен JSON-ответ
[{
"name": "A1",
"date": "2019-03-13",
"comment": "xyz"
},
{
"name": "A1",
"date": "2019-03-13",
"comment": "abc"
},
{
"name": "B1",
"date": "2019-03-13",
"comment": "pqr"
},
{
"name": "A1",
"date": "2019-03-14",
"comment": "mno"
}
]
Ожидаемый результат
[
{
"name": "A1",
"date": "2019-03-13",
"data": [
{
"name": "A1",
"date": "2019-03-13",
"comment": "xyz"
},
{
"name": "A1",
"date": "2019-03-13",
"comment": "abc"
}
],
{
"name": "A1",
"date": "2019-03-14",
"data": [
{
"name": "A1",
"date": "2019-03-14",
"comment": "mno"
}
]
},
{
"name": "B1",
"date": "2019-03-13",
"data": [
{
"name": "B1",
"date": "2019-03-13",
"comment": "pqr"
}
]
}
]
Я хочу создать новый массив javascript, который содержит уникальное имя и дату и соответствующие данные.
Может ли кто-нибудь помочь мне здесь?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать array#reduce для группировки даты на основе name и date в накопителе объектов, а затем извлечь все значения, используя Object.values().
let data = [{ "name": "A1", "date": "2019-03-13", "comment": "xyz" }, { "name": "A1", "date": "2019-03-13", "comment": "abc" }, { "name": "B1", "date": "2019-03-13", "comment": "pqr" }, { "name": "A1", "date": "2019-03-14", "comment": "mno" } ],
result = Object.values(data.reduce((r,{name,date, comment}) => {
r[name + "_" + date] = r[name + "_" + date] || {name, date, data: []};
r[name + "_" + date].data.push({name,date,comment});
return r;
},{}));
console.info(result);.as-console-wrapper { max-height: 100% !important; top: 0; }Мне потребовалось больше времени, чтобы опубликовать этот вопрос, по сравнению с вашим столь быстрым ответом. Благодаря тонну!!!
Вы можете взять массив для нужной группировки и искать объект.
var data = [{ name: "A1", date: "2019-03-13", comment: "xyz" }, { name: "A1", date: "2019-03-13", comment: "abc" }, { name: "B1", date: "2019-03-13", comment: "pqr" }, { name: "A1", date: "2019-03-14", comment: "mno" }],
groupBy = ['name', 'date'],
grouped = data.reduce((r, o) => {
var temp = r.find(p => groupBy.every(k => o[k] === p[k]));
if (!temp) {
r.push(temp = Object.assign(...groupBy.map(k => ({ [k]: o[k] })), { data: [] }));
}
temp.data.push(o);
return r;
}, []);
console.info(grouped);.as-console-wrapper { max-height: 100% !important; top: 0; }Вы можете использовать reduce для сбора значений:
var input = [{
"name": "A1",
"date": "2019-03-13",
"comment": "xyz"
},
{
"name": "A1",
"date": "2019-03-13",
"comment": "abc"
},
{
"name": "B1",
"date": "2019-03-13",
"comment": "pqr"
},
{
"name": "A1",
"date": "2019-03-14",
"comment": "mno"
}
]
var res = input.reduce((acc, {name, date, comment}) => {
var found = acc.find(el => el.name === name && el.date === date);
return found
? found.data.push({name, date, comment}) && acc
: [...acc, {name, date, data: [{name, date, comment}]}];
}, []);
console.info(JSON.stringify(res));способ Легкий сделать это:
const data = [{
"name": "A1",
"date": "2019-03-13",
"comment": "xyz"
},
{
"name": "A1",
"date": "2019-03-13",
"comment": "abc"
},
{
"name": "A1",
"date": "2019-03-13",
"comment": "fffffffff"
},
{
"name": "B1",
"date": "2019-03-13",
"comment": "pqr"
},
{
"name": "B1",
"date": "2019-03-13",
"comment": "hhhhhhhhhhh"
},
{
"name": "A1",
"date": "2019-03-14",
"comment": "mno"
}
]
const res = data.reduce((all, acc) => {
const found = all.find(o => o.name === acc.name && o.date === acc.date)
if (found === undefined) {
all.push(acc)
} else {
found.data = (found.data || []).concat(acc)
}
return all;
}, [])
console.info(res)
Зачем дублирование данных?