首页 > 解决方案 > 比较同一数组的元素的最快方法

问题描述

我有一个对象数组

[
{
    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
    }
}]

我想相互比较元素(对象)以获得所有包含相同props1props2

所以我的结果应该是

[
    [
        {
            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 解决方案的性能

标签: javascriptarrays

解决方案


无耻的自插拔:我的库,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>


推荐阅读