我目前有一个像这样的对象数组:
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},
];
我正在尝试生成一个新数组,该数组按current
和previous
年对对象进行分组,并按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));
关于如何执行此操作有什么建议?
编辑:
我需要这样做的原因是为了进行过滤。如果单击current
或previous
,则需要查看相应的模型。
答案 0 :(得分:2)
您可以检查键并将其拼接到当前数组上,或压入previous
数组。
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; }
答案 1 :(得分:0)
考虑到输出中有错字,即
{ key: 'model_5', year: 2018, displayOrder: 6 }
应该当前存在(根据op的注释)。 您可以尝试以下操作:
基于键,按降序对数组进行排序,按升序将年份排序,然后按升序显示顺序。之后,您可以简单地遍历列表并获得所需的结果。请尝试以下操作:
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},
];
array.sort((a,b)=> a.key.localeCompare(b.key) || b.year - a.year|| a.displayOrder - b.displayOrder);
var result = {
"current" : [],
"previous" : []
};
for(var i = 0; i < array.length; i++){
if(i == 0 || result.current[result.current.length-1].key != array[i].key){
result.current.push(array[i]);
} else{
result.previous.push(array[i]);
}
}
console.log(result);