javascript - 比较同一数组的元素的最快方法
问题描述
我有一个对象数组
[
{
id1: {
props1: 1,
props2: 2,
props3: 3
}
},
{
id2: {
props1: 1,
props2: 3,
props3: 4
}
},
{
id3: {
props1: 1,
props2: 2,
props3: 4
}
},
{
id4: {
props1: 2,
props2: 2,
props3: 3
}
},
{
id5: {
props1: 2,
props2: 2,
props3: 4
}
}]
我想相互比较元素(对象)以获得所有包含相同props1
和props2
所以我的结果应该是
[
[
{
id1: {
props1: 1,
props2: 2,
props3: 3
}
},
{
id3: {
props1: 1,
props2: 2,
props3: 4
}
}
],
[
{
id4: {
props1: 2,
props2: 2,
props3: 3
}
},
{
id5: {
props1: 2,
props2: 2,
props3: 4
}
}
]
]
有没有办法在不使用 2 个 for 循环的情况下相互比较 2 个元素(对象)?当数组的大小很大时,我担心 2 for-loop 解决方案的性能
解决方案
无耻的自插拔:我的库,blinq
对于高效执行这种转换非常方便。
const {
blinq,
deepComparer
} = window.blinq;
const data = [{
id1: {
props1: 1,
props2: 2,
props3: 3
}
},
{
id2: {
props1: 1,
props2: 3,
props3: 4
}
},
{
id3: {
props1: 1,
props2: 2,
props3: 4
}
},
{
id4: {
props1: 2,
props2: 2,
props3: 3
}
},
{
id5: {
props1: 2,
props2: 2,
props3: 4
}
}
]
const transformedData = blinq(data)
.selectMany(x => Object.entries(x))
.groupBy(([k, v]) => ({
props1: v.props1,
props2: v.props2
}), deepComparer)
.where(g => g.count() > 1)
.select(g => g
.select(x => Object.fromEntries([x]))
.toArray()
)
.toArray();
console.log(transformedData);
<script src="https://cdn.jsdelivr.net/npm/blinq"></script>
推荐阅读
- git - 在不包含测试的作业中跳过步骤
- cluster-analysis - 为什么 k-means 在聚类方面比 LDA 等主题建模算法更好?
- c - C 中是否有任何函数可以替换我给定程序的 getch() ,因为它是非标准函数?
- django - 如何处理同一页面中的表单和表单集?
- reactjs - Facebook JavaScript SDK - Facebook 登录
- ruby-on-rails - 运行 RedMine 时如何更改 WEBrick :AccessLog 选项?
- git - 当其他人已经更改了同一个文件时,远程推送分支的最佳策略是什么
- javascript - Document.title 修改后不默认
- vnc - 如何在多用户中使用 Apache Guacamole 和 VNC?
- javascript - Highcharts:将两个系列水平对齐到相同的x轴,它们位于相对的两侧