如何解决使用lodash或香草javascript对对象数组进行排序和过滤
我有这个对象,我希望通过仅保留对象的2个最大值来进行排序和过滤。
obj={ A :[{
asset: 9,biodiversity: 4,infrastructure: 15,deflation: 11,energy: 9
}],B:[{
asset: 12,biodiversity: 10,infrastructure: 9,deflation: 7,energy: 15
}],C:[{
asset: 2,biodiversity: 12,infrastructure: 6,deflation: 6,energy: 8
}]}
我想按对象的值对它们进行排序,并过滤掉2个最高的对象,例如:
{A :[{
infrastructure: 15,deflation: 11
}],B:[{
energy: 15,asset: 12
}],C:[{
biodiversity: 12,energy: 8
}]}
我已经尝试过进行排序:
Object.keys(obj).forEach((a) => _.sortBy(obj[a][0])))
但这显然是错误的。 我正在使用lodash,但也会接受普通的javascript解决方案。
解决方法
您可以获取内部对象的条目并按值降序排序,获取前两个键/值对,并从中构建一个新对象。
const
data = { A: [{ asset: 9,biodiversity: 4,infrastructure: 15,deflation: 11,energy: 9 }],B: [{ asset: 12,biodiversity: 10,infrastructure: 9,deflation: 7,nergy: 15 }],C: [{ asset: 2,biodiversity: 12,infrastructure: 6,deflation: 6,energy: 8 }]},result = Object.fromEntries(Object
.entries(data)
.map(([k,a]) => [k,a.map(o => Object.fromEntries(Object
.entries(o)
.sort((a,b) => b[1] - a[1])
.slice(0,2)
))])
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
,
(编辑/注意:这是基于您最初发布的代码。很高兴看到您更新了问题并摆脱了包装数组。)
这是一种相对实用的方法。
entityManager.refresh
函数在每个对象内找到阈值。
secondLargestValue
函数为我们提供了该对象的修改后的副本。
我们遍历顶级对象中的条目并应用这两个函数。 请参阅代码中的注释以进一步说明。
copyWithoutValsBelowThreshold
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。