我有兩個清單:
let originalDocs = [
{
id: "sara",
date: new Date("01/01/2022")
},
{
id: "vic",
date: new Date("10/26/2020")
}
];
let newDocs = [
{
id: "vic",
date: new Date("01/02/2022")
},
{
id: "raul",
date: new Date("05/05/2021")
}
];
我需要混合兩個串列,按日期排序(降序)并且不重復。
為此,我決定:
- 洗掉包含在新陣列中的原始陣列的元素集(我的意思是洗掉交集)而不修改原始陣列。
- 按日期混合結果陣列排序。
這是我當前的代碼:
function removeIntersection(originalDocs, newDocs) {
return originalDocs.filter((originalDoc) => {
const index = newDocs.findIndex(
(newDoc) => newDoc.id === originalDoc.id
);
return index === -1;
});
}
function mixInOrder(originalDocs, newDocs) {
return [...newDocs, ...originalDocs]
.sort((a, b) => b.date - a.date);
}
//
// MAIN
//
let originalDocs = [
{
id: "sara",
date: new Date("01/01/2022")
},
{
id: "vic",
date: new Date("10/26/2020")
}
];
let newDocs = [
{
id: "vic",
date: new Date("01/02/2022")
},
{
id: "raul",
date: new Date("05/05/2021")
}
];
const result = mixInOrder(
removeIntersection(originalDocs, newDocs),
newDocs
);
console.log(result);
我的意思是,在對串列進行排序之前不需要合并(使用擴展語法)串列,或洗掉 O(1) 中的交集,我如何才能以更優化的方式執行相同操作。
我的意思是,是否可以僅插入以避免復制?
uj5u.com熱心網友回復:
您可以使用Set和輕松實作結果reduce:
- 通過添加第
originalDocs一個然后再添加一個新陣列newDocs。 - 使用
reduce回圈新創建的陣列上,然后篩選的物件。
您可以使用
Set有效的方式檢查密鑰是否存在
- 過濾后,您可以相應地對其進行排序。
let originalDocs = [
{
id: 'sara',
date: new Date('01/01/2022'),
},
{
id: 'vic',
date: new Date('10/26/2020'),
},
];
let newDocs = [
{
id: 'vic',
date: new Date('01/02/2022'),
},
{
id: 'raul',
date: new Date('05/05/2021'),
},
];
const set = new Set();
const result = [...originalDocs, ...newDocs].reduce((acc, curr) => {
if (!set.has(curr.id)) {
acc.push(curr);
set.add(curr.id);
}
return acc;
}, [])
.sort((a, b) => b.date - a.date);
console.log(result);
uj5u.com熱心網友回復:
以下是使用 JS Map 執行此操作的方法,您可以在其中使用idas 識別符號:
let originalDocs = [
{
id: "sara",
date: new Date("01/01/2022")
},
{
id: "vic",
date: new Date("10/26/2020")
}
];
let newDocs = [
{
id: "vic",
date: new Date("01/02/2022")
},
{
id: "raul",
date: new Date("05/05/2021")
}
];
const map = new Map(originalDocs.map(el => [el.id, el]));
newDocs.forEach(el => map.set(el.id, el));
const sorted = [...map.values()].sort((a, b) => a.date - b.date);
console.log(sorted)
這將覆寫任何originalDocs一個條目newDocs,如果他們有相同的條目id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/401230.html
標籤:javascript 算法
