Javascript 从对象数组中筛选

Javascript 从对象数组中筛选,javascript,arrays,filtering,Javascript,Arrays,Filtering,我有一个Vue.jsweb应用程序,它使用express.jsAPI中的数据,并在表中显示响应数组。数组的每个对象都有由Name\u Version形成的唯一id(例如P.90.001000-0004\u 2)。问题是,我只需要显示每个版本的最后一个版本。例如,如果API响应为: [{id: P.90.001000-0004_1}, {id: P.90.001000-0004_2}, {id: P.90.001000-0004_3}, {id: P.90.002222-0025_1}, {id:

我有一个
Vue.js
web应用程序,它使用
express.js
API中的数据,并在表中显示响应数组。数组的每个对象都有由
Name\u Version
形成的唯一id(例如
P.90.001000-0004\u 2
)。问题是,我只需要显示每个版本的最后一个版本。例如,如果API响应为:

[{id: P.90.001000-0004_1}, {id: P.90.001000-0004_2}, {id: P.90.001000-0004_3}, {id: P.90.002222-0025_1}, {id: P.90.002222-0025_2}]
表中显示的结果数组为:

[{id: P.90.001000-0004_3}, {id: P.90.002222-0025_2}]

我不可能达到这个结果,有人能帮我吗

您可以使用
reduce
获取最新版本,然后使用
Object.entries
map
join
将其重新格式化:

const arr=[{id:'P.90.001000-0004_1'},{id:'P.90.001000-0004_2'},{id:'P.90.001000-0004_3'},{id:'P.90.00222-0025_1'},{id:'P.90.00222-0025_2'}]
const latest=arr.reduce((a,{id})=>{
常数[k,v]=id.split(“”)
a[k]=+v>(a[k]| | 0)?v:a[k]
归还
}, {})
const output=Object.entries(latest.map)(pair=>({id:pair.join('''')}))

console.log(输出)
您可以使用
reduce
获取最新版本,然后使用
Object.entries
map
join
将其重新格式化:

const arr=[{id:'P.90.001000-0004_1'},{id:'P.90.001000-0004_2'},{id:'P.90.001000-0004_3'},{id:'P.90.00222-0025_1'},{id:'P.90.00222-0025_2'}]
const latest=arr.reduce((a,{id})=>{
常数[k,v]=id.split(“”)
a[k]=+v>(a[k]| | 0)?v:a[k]
归还
}, {})
const output=Object.entries(latest.map)(pair=>({id:pair.join('''')}))

console.log(输出)
您可以构建一个对象,将id的一部分映射到整个对象,而不将版本映射到整个对象,并且您可以在此映射中仅保留每个项目的最新版本:

const data=[{id:'P.90.001000-0004_1'},{id:'P.90.001000-0004_2'},{id:'P.90.001000-0004_3'},{id:'P.90.00222-0025_1'},{id:'P.90.00222-0025_2'}];
常量映射={};
data.forEach((项目)=>{
const[id,version]=item.id.split(“”);
const latestItem=map[id];
如果(!latestItem| | latestItem.id.split(“|”)[1]<版本){
map[id]=项目;
}
});
常量filteredData=Object.values(映射);

console.log(filteredData)您可以构建一个对象,将id的一部分映射到整个对象,而不将版本映射到整个对象,并且您可以在此映射中仅保留每个项目的最新版本:

const data=[{id:'P.90.001000-0004_1'},{id:'P.90.001000-0004_2'},{id:'P.90.001000-0004_3'},{id:'P.90.00222-0025_1'},{id:'P.90.00222-0025_2'}];
常量映射={};
data.forEach((项目)=>{
const[id,version]=item.id.split(“”);
const latestItem=map[id];
如果(!latestItem| | latestItem.id.split(“|”)[1]<版本){
map[id]=项目;
}
});
常量filteredData=Object.values(映射);

console.log(filteredData)这是从API接收到的非常糟糕的格式。我会将分组逻辑迁移到服务器而不是客户端,否则您需要手动拆分ID并获取最新的ID,这在客户端有点昂贵且毫无意义。从API接收到的格式非常糟糕。我会将分组逻辑迁移到服务器而不是客户端,否则您需要手动拆分ID并获取最新的ID,这在客户端有点昂贵且毫无意义。您应该确保
\uu
只出现一次,否则您应该使用它的lastIndexOf。另外,我想你也应该考虑在没有一个实例的情况下不存在“<代码> <代码> >的情况,并且出于某种原因,不管是谁制造了这样的API,都不需要<代码> < /C>。每个对象中只有一个事件,并且它们都有终止(从0到x),所以你可以排除这两个问题。尽管如此,这个解决方案还是非常有效的。非常感谢@TyxLux619很乐意帮助:)你应该确保<代码> <代码>只有一个发生,否则你应该使用它的ListToCuxOf。而且,我猜你也应该考虑在没有一个实例的情况下,不存在“<代码> < />代码>的情况。制作这种API的人认为不需要
。\uu在每个对象中只有一次出现,并且所有对象都有该终止(从0到X),因此可以避免这两件事。尽管如此,这个解决方案还是非常有效的。非常感谢@titanlux619很高兴提供帮助:)此解决方案有效,但结果数组仅包含de属性id,每个对象还有15个属性需要在表中显示。如何保留每个对象的其余属性?@titanlux619现在检查我的答案此解决方案返回的对象数量与以前的解决方案相同,并且每个对象的所有属性都相同,但存在大量重复项。我试图修改和改进它,但没有成功@阿尔贝托·特里尼达德·塔瓦雷斯的回答无论如何都很有魅力。也非常感谢你!这个解决方案可行,但结果数组只包含de属性id,每个对象还有15个属性需要在表中显示。如何保留每个对象的其余属性?@titanlux619现在检查我的答案此解决方案返回的对象数量与以前的解决方案相同,并且每个对象的所有属性都相同,但存在大量重复项。我试图修改和改进它,但没有成功@阿尔贝托·特里尼达德·塔瓦雷斯的回答无论如何都很有魅力。也非常感谢你!