【问题标题】:Multilevel group by using lodash使用 lodash 进行多级分组
【发布时间】:2019-04-12 11:42:04
【问题描述】:

我有以下对象数组

const array = [
  {
    key: '11111',
    address: { city: 'NY', country: 'USA' },
    className: 'google.com',
    deviceId: 'aaaaa'
  },
  { 
    key: '11111',
    address: { city: 'NY', country: 'USA' },
    className: 'google.com',
    deviceId: 'aaaaa'
  },
  { 
    key: '33333',
    address: { city: 'NY', country: 'USA' },
    className: 'facebook.com',
    deviceId: 'aaaaa'
  },
  { 
    key: '11111',
    address: { city: 'NY', country: 'USA' },
    className: 'google.com',
    deviceId: 'ddddd'
  },
  {
    key: '22222',
    address: { city: 'Landon', country: 'UK' },
    className: 'stackoverflow.com',
    deviceId: 'ccccc'
  },
  {
    key: '22222',
    address: { city: 'Landon', country: 'UK' },
    className: 'stackoverflow.com',
    deviceId: 'ggggg'
  },
  {
    key: '22222',
    address: { city: 'Landon', country: 'UK' },
    className: 'stackoverflow.com',
    deviceId: 'fffff'
  }
]

我需要下面的输出

[
  {
    "keys": {
      "address": { "city": "NY", "country": "USA" },
      "className": "google.com",
      "key": "11111"
    },
    "count": 2
  },
  {
    "keys": {
      "address": { "city": "NY", "country": "USA" },
      "className": "facebook.com",
      "key": "33333"
    },
    "count": 1
  },
  {
    "keys": {
      "address": { "city": "Landon", "country": "UK" },
      "className": "stackoverflow.com",
      "key": "22222"
    },
    "count": 3
  }
]

那么这里到底发生了什么。

1) 如果用户使用相同的keyaddressclassNamedeviceId,我必须将用户算作一个。

然后

2) 我想与keyclassNameaddress 分组并找到计数。

我该怎么做?

谢谢!!!请询问是否需要更多信息。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 嗯,我期待同样的问题。我已经尝试过这个link,但它没有用

标签: javascript arrays group-by lodash


【解决方案1】:

您可以将groupBymap 方法链接到第一个按键、地址和类名分组,然后再执行一个groupBy 以对具有唯一deviceId 的元素进行分组和计数

const array = [{"key":"11111","address":{"city":"NY","country":"USA"},"className":"google.com","deviceId":"aaaaa"},{"key":"11111","address":{"city":"NY","country":"USA"},"className":"google.com","deviceId":"aaaaa"},{"key":"33333","address":{"city":"NY","country":"USA"},"className":"facebook.com","deviceId":"aaaaa"},{"key":"11111","address":{"city":"NY","country":"USA"},"className":"google.com","deviceId":"ddddd"},{"key":"22222","address":{"city":"Landon","country":"UK"},"className":"stackoverflow.com","deviceId":"ccccc"},{"key":"22222","address":{"city":"Landon","country":"UK"},"className":"stackoverflow.com","deviceId":"ggggg"},{"key":"22222","address":{"city":"Landon","country":"UK"},"className":"stackoverflow.com","deviceId":"fffff"}]

const result = _.chain(array)
  .groupBy(({ key, address: { city, country }, className }) => {
    return `${key}-${city}-${country}-${className}`
  }).map(e => {
    const [{ key, address, className }] = e;
    return {
      keys: { key, address, className },
      count: _.keys(_.groupBy(e, 'deviceId')).length
    }
  })

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

【讨论】:

  • 没有误解我的问题。请再看一遍。输出不匹配。
  • 可能你的输出有误,你也是按deviceId过滤的吗?
  • 非常抱歉我更新了我的问题。请看我的两点
  • 完美就是我想要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多