我目前有一个像这样的对象数组:
const array = [
{ key: 'model_1', year: 2019, displayOrder: 1},
{ key: 'model_1', year: 2018, displayOrder: 2},
{ key: 'model_2', year: 2018, displayOrder: 3},
{ key: 'model_3', year: 2018, displayOrder: 4},
{ key: 'model_4', year: 2019, displayOrder: 5},
{ key: 'model_5', year: 2018, displayOrder: 6},
];
我正在尝试生成一个新数组,该数组按当前
和上一年
对对象进行分组,并按displayOrder
对订单进行分组。如果我们将其应用于上面的数组,它将如下所示:
const array = {
current: [
{ key: 'model_1', year: 2019, displayOrder: 1 },
{ key: 'model_2', year: 2018, displayOrder: 3 },
{ key: 'model_3', year: 2018, displayOrder: 4 },
{ key: 'model_4', year: 2019, displayOrder: 5 },
{ key: 'model_5', year: 2018, displayOrder: 6 },
],
previous: [
{ key: 'model_1', year: 2018, displayOrder: 2 },
{ key: 'model_4', year: 2018, displayOrder: 7 },
],
};
其背后的理论是它应该显示模型的当前版本。这将基于模型的最近一年。
我尝试过创建一个按年份对它们进行分组的归约函数,但我认为这不是正确的方法,因为与进一步修改相比,可能会产生大量开销。
const modelsByYear = array.reduce((acc, model) => {
acc[model.year] = acc[model.year] || [];
acc[model.year].push(model);
return acc;
}, Object.create(null));
关于如何做到这一点,有哪些建议?
编辑:
我需要这个的原因是为了过滤。如果我点击当前
或上一个
,我需要查看相应的型号。
最佳答案
您可以检查 key 并拼接当前数组或推送到前一个
数组。
const array = [{ key: 'model_1', year: 2019, displayOrder: 1 }, { key: 'model_1', year: 2018, displayOrder: 2 }, { key: 'model_2', year: 2018, displayOrder: 3 }, { key: 'model_3', year: 2018, displayOrder: 4 }, { key: 'model_4', year: 2019, displayOrder: 5 }, { key: 'model_5', year: 2018, displayOrder: 6 }, { key: 'model_4', year: 2018, displayOrder: 7 }],
grouped = array.reduce((r, o) => {
var index = r.current.findIndex(({ key }) => o.key === key);
if (index !== -1) {
if (r.current[index].year > o.year) {
r.previous.push(o);
return r;
}
r.previous.push(r.current.splice(index, 1)[0]);
}
r.current.push(o);
return r;
}, { current: [], previous: [] });
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 如何修改对象数组以按最近年份分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177388/