У меня есть вопрос, как я могу отобразить и уменьшить массив следующим образом:
[
{
id: 1,
Price: 50,
Item: {id: 1, Name: "A"},
Date: {id: 1, Start: "202001"}
},
{
id: 2,
Price: 100,
Item: {id: 1, Name: "A"},
Date: {id: 2, Start: "202002"}
},
{
id: 3,
Price: 200,
Item: {id: 2, Name: "B"},
Date: {id: 1, Start: "202001"}
}
]
Я пишу приложение в React и хочу показать эти значения, сгруппированные в таблице.
Это должно выглядеть примерно так:
Я хотел бы иметь возможность сделать это с массивом:
[
{
id: 1,
Item: {id: 1, Name: "A"},
Date: [{id: 1, Start: "202001",Price: "50"},{id: 2, Start: "202002",Price: "100"}]
},
{
id: 2,
Item: {id: 2, Name: "B"},
Date: {id: 1, Start: "202001",Price: "200"}
}
]
Любые предложения, чтобы добраться до того, что мне нужно?
Я вставил таблицу в формате Markdown, чтобы вы могли увидеть результат, который я хочу
Пожалуйста, посмотрите этот пост. У него почти такой же вопрос. stackoverflow.com/a/34890276/9515661
Пробовал следующее, но не группируется: const tempData = [ { id: 1, Price: 50, Item: {id: 1, Name: "A"}, Date: {id: 1, Start: "202001"} }, { id: 2, Price: 100, Item: {id: 1, Name: "A"}, Date: {id: 2, Start: "202002"} }, { id: 3, Price: 200, Item: {id: 2, Name: "B"}, Date: {id: 1, Start: "202001"} } ] var groupBy = function(xs, key) { return xs.reduce(function(rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); }; console.info(groupBy(tempData, 'Item.Name'));
Вы можете использовать groupBy
метод lodash
, чтобы сгруппировать набор данных в соответствии с Item.Name
.
Сначала получите пакет:
npm i lodash.groupby
Затем используйте его в своем коде как
import groupBy from 'lodash.groupby'
const tempData = [
{
id: 1,
Price: 50,
Item: {id: 1, Name: "A"},
Date: {id: 1, Start: "202001"}
},
{
id: 2,
Price: 100,
Item: {id: 1, Name: "A"},
Date: {id: 2, Start: "202002"}
},
{
id: 3,
Price: 200,
Item: {id: 2, Name: "B"},
Date: {id: 1, Start: "202001"}
}
]
groupBy(tempData, 'Item.Name')
/*
Will result as below
{
A: [
//objects with 'Item.Name' === 'A'
],
B: [
//objects with 'Item.Name' === 'B'
]
}
*/
Затем вам нужно заполнить свою таблицу ключами внутри ответа от groupBy
Спасибо за помощь. Я получаю эту ошибку ./node_modules/lodash.groupby/index.js — Модуль не найден после установки lodash.groupby и запуска приложения.
Вы можете использовать Array.prototype.reduce()
, а затем использовать Object.values
следующим образом:
const arr = [
{
id: 1,
Price: 50,
Item: {id: 1, Name: "A"},
Date: {id: 1, Start: "202001"}
},
{
id: 2,
Price: 100,
Item: {id: 1, Name: "A"},
Date: {id: 2, Start: "202002"}
},
{
id: 3,
Price: 200,
Item: {id: 2, Name: "B"},
Date: {id: 1, Start: "202001"}
}
]
const res = Object.values(arr.reduce((acc, {Item, Date, Price}) => {
if (!acc[Item.id]) {
acc[Item.id] = {
id: Item.id,
Item,
Date: [{...Date, Price}]
};
} else {
acc[Item.id].Date = [...acc[Item.id].Date, {...Date, Price}];
}
return acc;
}, {}));
console.info(res);
Спасибо! Я проверю это, создав таблицу, а затем расскажу, что получилось.
Я хотел упорядочить массив таким образом, чтобы упростить сопоставление данных. Каков наилучший способ перебрать его и отобразить значения в том виде, в котором они есть в таблице?
@bonnegnu map()
в порядке
какой результат вы хотите получить в итоге?