首页 > 解决方案 > 给定一个对象数组,将它们分组,只留下每个对象的一个​​记录,给定一个应该包含最小值的属性

问题描述

给定以下数组

[
  {
    balance: 105,
    address: 'dd',
    datetime: 2020-08-23T22:00:00.000Z
  },
  {
    balance: 111,
    address: 'aa',
    datetime: 2020-08-23T22:00:00.000Z
  },
  {
    balance: 115,
    address: 'dd',
    datetime: 2020-08-23T22:00:00.000Z
  },
  {
    balance: 123,
    address: 'aa',
    datetime: 2020-08-23T22:00:00.000Z
  },
  {
    balance: 153,
    address: 'dd',
    datetime: 2020-08-23T22:00:00.000Z
  }
]

我希望这个数组最终看起来像

[
      {
        balance: 105,
        address: 'dd',
        datetime: 2020-08-23T22:00:00.000Z
      },
      {
        balance: 111,
        address: 'aa',
        datetime: 2020-08-23T22:00:00.000Z
      }
    ]

我已经根据其地址获取了重复的对象,只留下了余额值最低的对象。

标签: javascript

解决方案


使用Array#reduce来累积所需的对象。为此,如果在累积的结果对象中存在具有地址值的属性作为键,则查找每个对象。如果不创建一个,则将对象添加为值。否则查看当前对象的余额是否更小,如果是,则更新对象。
最后使用Object.values获取所需数组的值。

function convert(array) {
    return Object.values(array.reduce((acc, cur) => {
        if (!acc[cur.address]) {
            acc[cur.address] = cur;
        } else {
            if (cur.balance <  acc.balance) {
                 acc[cur.address] = cur;
            }
        }
        return acc;
    }, {}));
}

let array = [
  {
    balance: 105,
    address: 'dd',
    datetime: '2020-08-23T22:00:00.000Z'
  },
  {
    balance: 111,
    address: 'aa',
    datetime: '2020-08-23T22:00:00.000Z'
  },
  {
    balance: 115,
    address: 'dd',
    datetime: '2020-08-23T22:00:00.000Z'
  },
  {
    balance: 123,
    address: 'aa',
    datetime: '2020-08-23T22:00:00.000Z'
  },
  {
    balance: 153,
    address: 'dd',
    datetime: '2020-08-23T22:00:00.000Z'
  }
];

console.log(convert(array));


推荐阅读