Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按id对唯一数组排序并保留最后一个值_Javascript_Arrays_Typescript_Sorting - Fatal编程技术网

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

})