【问题标题】:How group multiple using lodash如何使用 lodash 对多个进行分组
【发布时间】:2019-08-31 14:09:47
【问题描述】:

我有下面的数组

const array = [
  {
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'NY', country: 'USA' },
    className: 'FourthActivity',
    deviceId: '1111111111111111'
  },
  { 
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'NY', country: 'USA' },
    className: 'FourthActivity',
    deviceId: '222222222222222'
  },
  {
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'Landon', country: 'UK' },
    className: 'FourthActivity',
    deviceId: '33333333333'
 }
]

我必须使用对象内部的两个属性(即addressclassName)对其进行分组。如何使用 loadash 或 javascript 做到这一点?

预期输出

[{
  address: { city: 'NY', country: 'USA' }, className: 'FourthActivity',
  count: 2,
  data: [{
    deviceId: 222222222222222,
  }, {
    deviceId: 1111111111111111,
  }]
}, {
  address: { city: 'Landon', country: 'UK' }, className: 'FourthActivity',
  count: 1,
  data: [{
    deviceId: 33333333333,
  }]
}]

我试过了,但是不行

var selectedVehicle = _.filter(array, 'address')

  const selectedVehicles = _.groupBy(selectedVehicle, function(item) {
  return item.makeCode;
})

console.log(selectedVehicles)

【问题讨论】:

  • city: 'NY', country: 'USA' city: 'Landon', country: 'UK' 在您的预期输出中来自哪里?它不在您的输入中。
  • 更新了我的问题@CertainPerformance

标签: javascript arrays lodash


【解决方案1】:

您可以将reduce 放入一个对象,如果给定的地址/类名对尚不存在{ address, className, count: 0, data: [] },则创建它,然后获取该对象的值:

const array = [
  {
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'NY', country: 'USA' },
    className: 'FourthActivity',
    deviceId: '1111111111111111'
  },
  { 
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'NY', country: 'USA' },
    className: 'FourthActivity',
    deviceId: '222222222222222'
  },
  {
    key: 'TSJUcgLGig2UOdjAzlqq4KW5GK6PKXHC2ndw40HYIss7EKsV6nJ',
    location: { lat: '22.7196', lng: '75.8577' },
    address: { city: 'Landon', country: 'UK' },
    className: 'FourthActivity',
    deviceId: '33333333333'
 }
]
const output = Object.values(array.reduce((a, { address, className, deviceId }) => {
  const addressClassNameStr = JSON.stringify({ address, className });
  if (!a[addressClassNameStr]) {
    a[addressClassNameStr] = { address, className, count: 0, data: [] };
  }
  a[addressClassNameStr].count++;
  a[addressClassNameStr].data.push({ deviceId });
  return a;
}, {}));
console.log(output);

【讨论】:

  • 没有什么比你的答案更完美了。非常感谢闪电般的快速回答。想知道这是否可以使用 lodash 完成?或者这是最好的方法?
  • 您也可以在 Lodash 中使用 groupBy 回调开始它:return JSON.stringify({ address, className });(但在普通 JS 中非常简单,因此不需要库 IMO)
  • 嗨,我可以使用 count 对数据进行排序吗?
  • 所以我需要再使用一个循环吗?可以用上面的一个来完成吗?
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 2016-12-27
  • 2018-08-28
  • 2019-10-07
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多