Групповые данные на основе нескольких ключей в javascript

Получен 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, который содержит уникальное имя и дату и соответствующие данные.

Может ли кто-нибудь помочь мне здесь?

Зачем дублирование данных?

mplungjan 13.03.2019 14:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
56
4

Ответы 4

Вы можете использовать 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; }

Мне потребовалось больше времени, чтобы опубликовать этот вопрос, по сравнению с вашим столь быстрым ответом. Благодаря тонну!!!

Krunal Shah 13.03.2019 14:52

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

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)

Другие вопросы по теме