javascript - 根据一个键删除重复项并取数组中另一个键的最小值
问题描述
如何在对象数组中按一个键排序并通过另一个键进行重复数据删除?
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' } ]
解决方案
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)
推荐阅读
- java - 部署成功后的404
- botframework - 微软示例 52 -
- reactjs - 如何在firebase实时数据库和身份验证上生成相同的用户ID
- quarkus - Quarkus、Apache 目录 api、google libphonenumber 库不适用于本机
- sql - Oracle 中的转置功能
- php - Wordpress 类别页面在 URL 中显示类别和子类别
- netbeans - NetBeans Junit5 测试输出忽略 DisplayName 嵌套格式
- javascript - 如何修复 Express Route 处理程序中丢失的 SocketIO 会话数据?
- node.js - 让 Vue 应用程序正确读取 Heroku 上设置的环境变量的最佳方法是什么?
- linux - 根据条件关闭 nginx 模块