从对象数组过滤

时间:2019-12-05 11:28:32

标签: javascript arrays filtering

我有一个Vue.js网络应用程序,该应用程序使用express.js API中的数据并在表中显示响应数组。数组的每个对象都有由Name_Version组成的唯一ID(例如P.90.001000-0004_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}]

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

2 个答案:

答案 0 :(得分:2)

您可以使用reduce来获取最新版本,然后将Object.entriesmapjoin一起使用,以将它们重新设置为格式:

const arr = [{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'}]


const latest = arr.reduce((a, {id}) => {
  const [k,v] = id.split('_')
  a[k] = +v > (a[k] || 0) ? v : a[k]
  return a
}, {})

const output = Object.entries(latest).map(pair => ({ id: pair.join('_')}))

console.log(output)

如果需要保留其余属性,则可以使用地图,并按索引保留对原始对象的引用:

const arr = [{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'}]

const latest = arr.reduce((a, {id}, i) => {
  const [k,v] = id.split('_')
  if(!a.has(k) || +v > a.get(k)[0]) a.set(k, [+v, i])
  return a
}, new Map())

const output = [...latest.values()].map(([,i]) => arr[i])

console.log(output)

答案 1 :(得分:2)

您可以构建一个对象,该对象将ID的一部分(不包括版本)映射到整个对象,并且可以在该映射中仅保留每个项目的最新版本:

jar:file: