首页 > 解决方案 > 根据一个键删除重复项并取数组中另一个键的最小值

问题描述

如何在对象数组中按一个键排序并通过另一个键进行重复数据删除?

dist在我下面的示例中,在同一个 iD 下多次出现相同的内容。如何选择给定 id 的最小距离?

[ { dist: 1.2152494565059755, id: '37000' },
  { dist: 2.168068558345124, id: '9000' },
  { dist: 4.861213457464137, id: '37000' },
  { dist: 5.226238485876963, id: '04000' },
  { dist: 5.278968876845613, id: '29000' },
  { dist: 8.446987036894901, id: '09000' },
  { dist: 8.770432584510608, id: '09000' },
  { dist: 9.848816041209018, id: '04000' },
  { dist: 10.681310440202585, id: '58000' },
  { dist: 11.170746649119321, id: '58000' },
  { dist: 12.84374942857388, id: '37000' },
  { dist: 13.476922171827615, id: '09000' },
  { dist: 14.159308062885033, id: '09000' },
  { dist: 15.117353720958263, id: '80000' },
  { dist: 16.528082434902654, id: '58000' },
  { dist: 17.603866532406027, id: '80000' },
  { dist: 18.49748912990931, id: '37000' } ]

预期输出为

[ { dist: 1.2152494565059755, id: '37000' },
  { dist: 2.168068558345124, id: '09000' },
  { dist: 5.226238485876963, id: '04000' },
  { dist: 5.278968876845613, id: '29000' },
  { dist: 10.681310440202585, id: '58000' },
  { dist: 15.117353720958263, id: '80000' },
  { dist: 16.528082434902654, id: '58000' } ]

标签: javascriptarrayssortingobjectduplicates

解决方案


reduce您可以通过以下方式实现它Object.values

var array = [{dist:1.2152494565059755,id:'37000'},{dist:2.168068558345124,id:'9000'},{dist:4.861213457464137,id:'37000'},{dist:5.226238485876963,id:'04000'},{dist:5.278968876845613,id:'29000'},{dist:8.446987036894901,id:'09000'},{dist:8.770432584510608,id:'09000'},{dist:9.848816041209018,id:'04000'},{dist:10.681310440202585,id:'58000'},{dist:11.170746649119321,id:'58000'},{dist:12.84374942857388,id:'37000'},{dist:13.476922171827615,id:'09000'},{dist:14.159308062885033,id:'09000'},{dist:15.117353720958263,id:'80000'},{dist:16.528082434902654,id:'58000'},{dist:17.603866532406027,id:'80000'},{dist:18.49748912990931,id:'37000'}]
  
const merged = array.reduce((acc,a) =>{
  const id = parseInt(a.id);
  if(!acc[id] || acc[id]["dist"] > a.dist)
    acc[id] = a;
    
  return acc;
},{})

const final = Object.values(merged).sort((a,b) => a.dist - b.dist)

console.log(final)

创建一个累加器,每个唯一的id作为键,最小的对象 dist作为值,像这样

{
   "37000": {
      "dist": 1.2152494565059755,
      "id": "37000"
   },
   "9000": {
      "dist": 2.168068558345124,
      "id": "9000"
   },
   .... and so on
}

每次循环时,检查是否id已经存在或者dist累加器中的值是否大于当前项的dist. 如果是,则更新累加器。(parseInt()是必需的,因为“09000”和“9000”被认为是相同的id

然后用于Object.values将累加器对象的值转换为数组,最后sort根据dist值进行转换。

更新

如果Object.values 还不支持,您可以map通过Object.keys并获取如下值:

const final = Object.keys(merged).map(k => merged[k]).sort((a,b) => a.dist - b.dist)

推荐阅读