Javascript 按id对唯一数组排序并保留最后一个值
我有以下几点Javascript 按id对唯一数组排序并保留最后一个值,javascript,arrays,typescript,sorting,Javascript,Arrays,Typescript,Sorting,我有以下几点 let arr = [ { id: 1, referenceId: 1, type: "normal", name: "a" }, { id: 2, referenceId: 1, type: "normal", name: "b" }, { id: 3, referenceId: 3, type: "chat", name: "c" }, { i
let arr = [
{ id: 1, referenceId: 1, type: "normal", name: "a" },
{ id: 2, referenceId: 1, type: "normal", name: "b" },
{ id: 3, referenceId: 3, type: "chat", name: "c" },
{ id: 4, referenceId: 4, type: "normal", name: "d" },
{ id: 5, referenceId: 5, type: "chat", name: "e" },
{ id: 6, referenceId: 3, type: "chat", name: "f" }
];
我希望输出如下所示:
[
{ id: 1, referenceId: 1, type: "normal", name: "a" },
{ id: 2, referenceId: 1, type: "normal", name: "b" },
{ id: 4, referenceId: 4, type: "normal", name: "d" },
{ id: 5, referenceId: 5, type: "chat", name: "e" },
{ id: 6, referenceId: 3, type: "chat", name: "f" }
];
如果type==“chat”,我想进行排序,可以这样尝试(type==“normal”,无排序):
您可以对
referenceId->lastIndex
进行映射,然后在过滤器中查找索引,以便只保留与该referenceId
的最后一个索引匹配的索引。进行检查以确保我们只筛选出类型:“chat”
项目。时间复杂度是线性的
const arr=[
{id:1,referenceId:1,类型:“normal”,名称:“a”},
{id:2,referenceId:1,类型:“normal”,名称:“b”},
{id:3,referenceId:3,键入:“chat”,名称:“c”},
{id:4,referenceId:4,类型:“normal”,名称:“d”},
{id:5,referenceId:5,键入:“chat”,名称:“e”},
{id:6,referenceId:3,键入:“chat”,名称:“f”}
];
const lastIdxes=arr.reduce((a,e,i)=>{
a[e.referenceId]=i;
返回a;
}, {});
常数结果=arr.filter((e,i)=>
e、 键入!==“chat”| i===lastIdxes[e.referenceId]
);
控制台日志(结果)代码>您可以像这样使用reduce
让arr=[
{id:1,referenceId:1,类型:“normal”,名称:“a”},
{id:2,referenceId:2,类型:“normal”,名称:“b”},
{id:3,referenceId:3,键入:“chat”,名称:“c”},
{id:4,referenceId:4,类型:“normal”,名称:“d”},
{id:5,referenceId:5,键入:“chat”,名称:“e”},
{id:6,referenceId:3,键入:“chat”,名称:“f”}
];
res=arr.reduce((上一个,当前)=>{
index=prev.findIndex(item=>item.referenceId===curr.referenceId);
如果(索引>-1){
前拼接(索引1);
}
上推(当前);
返回上一个;
}, []);
控制台日志(res)代码>按此问题标题中所示的id排序,然后跟踪何时删除重复项
//按id排序并删除重复的引用id
常数arr=[
{id:1,referenceId:1,类型:“normal”,名称:“a”},
{id:2,referenceId:2,类型:“normal”,名称:“b”},
{id:3,referenceId:3,键入:“chat”,名称:“c”},
{id:4,referenceId:4,类型:“normal”,名称:“d”},
{id:5,referenceId:5,键入:“chat”,名称:“e”},
{id:6,referenceId:3,键入:“chat”,名称:“f”}
];
arr.sort((a,b)=>a.id>b.id?1:-1);
常数toDrop=[];
常量映射器={};
arr.forEach((当前,i)=>{
if(映射器[当前引用ID]!==未定义){
toDrop.unshift(映射程序[curr.referenceId]);
}
映射器[curr.referenceId]=i;
});
toDrop.forEach(i=>{
阵列拼接(i,1);
});
控制台日志(arr)代码>欢迎来到SO!您在过滤器
回调中的逻辑让我有点困惑。item.type==“normal”
与规范的其余部分有什么关系?只有排序类型==“chat”,如果类型==“normal”没有排序
arr.filter(item => {
if (item.type === "normal") {
return item
}
//sort array by referenceId and keeping last item
})