Форматировать сгруппированные данные из JSON данных - PullRequest
2 голосов
/ 05 мая 2020

Я пытаюсь отформатировать сгруппированные данные, полученные от JSON, но не могу этого сделать.

Это мой массив объектов:

arr = [
            {
                "date": "2020-01-01",
                "metric": 32,
                "type": "Google"
            },
            {
                "date": "2020-01-01",
                "metric": 24,
                "type": "Bing"
            },
            {
                "date": "2020-01-02",
                "metric": 1,
                "type": "Google"
            },
            {
                "date": "2020-01-02",
                "metric": 32,
                "type": "Jeeves"
            },
            {
                "date": "2020-01-03",
                "metric": 24,
                "type": "Bing"
            },
            {
                "date": "2020-01-03",
                "metric": 30,
                "type": "Google"
            }
          ]

Я хочу сгруппировать все показатели по дате. Итак, я сделал это:

const groupBy = (array, key) => {
    return array.reduce((result, currentValue) => {
      (result[currentValue[key]] = result[currentValue[key]] || []).push(currentValue);
      return result;
    }, {});
};

const personGroupedByColor = groupBy(arr, 'date');

Когда я это сделаю:

2020-01-01: 
0: {date: "2020-01-01", metric: 32, type: "Google"}
1: {date: "2020-01-01", metric: 24, type: "Bing"}
2020-01-02: 
0: {date: "2020-01-02", metric: 1, type: "Google"}
1: {date: "2020-01-02", metric: 32, type: "Jeeves"}
2020-01-03: 
0: {date: "2020-01-03", metric: 24, type: "Bing"}
1: {date: "2020-01-03", metric: 30, type: "Google"}

Есть ли способ отформатировать данные, чтобы они выглядели так:

{"date_val": "2020-01-01", "metric_name": [32, 24]}
{"date_val": "2020-01-02", "metric_name": [1, 32]}
{"date_val": "2020-01-03", "metric_name": [24, 30]}

Как его отформатировать, чтобы он выглядел так? Мои данные - это Dynami c, поэтому я хочу иметь возможность жестко кодировать как можно меньше.

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Сделайте что-нибудь подобное

  Object.entries(personGroupedByColor).map(([key, group]) => ({
    ['date_val']: key,
    ['metric_name']: group.map(entry => entry.metric),
  }))
1 голос
/ 05 мая 2020

Вы можете использовать array.reduce и динамически оценивать ключи результатов на основе указанных полей:

let arr = [
            {
                "date": "2020-01-01",
                "metric": 32,
                "type": "Google"
            },
            {
                "date": "2020-01-01",
                "metric": 24,
                "type": "Bing"
            },
            {
                "date": "2020-01-02",
                "metric": 1,
                "type": "Google"
            },
            {
                "date": "2020-01-02",
                "metric": 32,
                "type": "Jeeves"
            },
            {
                "date": "2020-01-03",
                "metric": 24,
                "type": "Bing"
            },
            {
                "date": "2020-01-03",
                "metric": 30,
                "type": "Google"
            }
          ];
          
  let group = (arr, val, name) => arr.reduce((acc, curr) => {
      let valKey = val +"_val";
      let nameKey = name + "_name";
      let valValue = curr[val];
      let nameValue = curr[name];
      
      let existing = acc.find(x => x[valKey] === valValue);
      if(existing){
         existing[nameKey].push(nameValue);
      } else {
         acc.push({[valKey]: valValue, [nameKey]: [nameValue]})
      }
      return acc;
  }, []);
  
  console.log(group(arr, 'date', 'metric'))
1 голос
/ 05 мая 2020

Вы можете reduce() массив и проверить, есть ли данная дата уже в аккумуляторе, если да, pu sh текущую дату для него, иначе создать новый объект с этой датой в массив:

arr = [{
    date: "2020-01-01",
    metric: 32,
    type: "Google",
  },
  {
    date: "2020-01-01",
    metric: 24,
    type: "Bing",
  },
  {
    date: "2020-01-02",
    metric: 1,
    type: "Google",
  },
  {
    date: "2020-01-02",
    metric: 32,
    type: "Jeeves",
  },
  {
    date: "2020-01-03",
    metric: 24,
    type: "Bing",
  },
  {
    date: "2020-01-03",
    metric: 30,
    type: "Google",
  },
];

let result = arr.reduce((p, c) => {
  let match = p.find(o => o.date_val === c.date);
  if (match) {
    match.metric_name.push(c.metric)
  } else {
    p.push({
      date_val: c.date,
      metric_name: [c.metric],
    });
  }
  return p;
}, []);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...