Сопоставить объект с массивом в качестве значений массива объектов - PullRequest
0 голосов
/ 22 марта 2020

У меня есть следующий объект с массивами в качестве значений:

{
  A: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}],

  B: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}],

  C: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}]
}

Моя цель - преобразовать эти данные в массив объектов:

[
 {
  "date": "21.01.2020",
  "A": 4000,
  "B": 4000,
  "C": 4000
 },
 {
  "date": "22.01.2020",
  "A": 3800,
  "B": 3800,
  "C": 3800
 }
]

Я понимаю, что могу получить отдельные ключи (A, B, C) из текущего объекта, используя:

Object.keys(...)

Моя проблема в том, что я не хочу отображать сам текущий объект, но мне нужно отобразить через значения текущего объекта, массива, содержащего данные, которые мне нужны (исходный объект содержит 3 пары ключевых значений, цель состоит в том, чтобы преобразовать это в 2 объекта).

Каков наилучший способ сопоставить значения объекта и создать массив?

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Вы можете использовать этот подход, используя только forEach. В этом методе я сначала группирую данные по дате, а затем возвращаю значения объекта в массив.

const data = {
	A: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}],
	B: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}],
	C: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}]
};

const res = {};

// Group the data object by the date and make another object
Object.keys(data).forEach(key => {
    data[key].forEach(value => {
	if (typeof res[value.date] == 'undefined') {
	    res[value.date] = {};
	}
	res[value.date].date = value.date;
	res[value.date][key] = value.number;
    });
});

// Finally make the object as array of object
const output = Object.values(res);
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 22 марта 2020

Я могу быть глупым, но мне нужно больше места, когда я делаю подобные вещи.

В этом случае я также хотел бы убедиться, что дата уникальна, поэтому выделил бы эту часть кода.

// include the key in the entries and flatten the array
const flat = Object.entries(data).flatMap(([key, values]) =>
    values.map(({number, date}) => ({number, date, key}))
, []);

// extract a set of dates
const dates = new Set(flat.map(entry => entry.date));

// bind the dates and their data in a 2d array
const table = Array.from(dates).map(date => 
    flat.filter(entry => entry.date === date)
);

// reduce the second dimension to an object
const merged = table.map(row => 
    row.reduce((obj, {date, key, number}) =>
        Object.assign(obj, {date, [key]: number})
    , {})
);
0 голосов
/ 22 марта 2020

Вы можете получить записи и затем выполнить итерацию массива.

Этот подход использует объект в виде таблицы ha sh и возвращает только значения таблицы ha sh.

var data = { A: [{ date: '21.01.2020', number: 4000 }, { date: '22.01.2020', number: 3800 }], B: [{ date: '21.01.2020', number: 4000 }, { date: '22.01.2020', number: 3800 }], C: [{ date: '21.01.2020', number: 4000 }, { date: '22.01.2020', number: 3800 }] },
    result = Object.values(Object.entries(data).reduce((r, [k, v]) => {
        v.forEach(({ date, number }) => (r[date] = r[date] || { date })[k] = number);
        return r;
    }, {}));

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