javascript - 使用 lodash 进行多级分组
问题描述
我有以下对象数组
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)key
如果用户具有相同的 ,和address
,我必须将用户仅算作一个。className
deviceId
接着
2)我想与 , 分组key
并className
找到address
计数。
我怎样才能做到这一点?
谢谢!!!请询问是否需要更多信息。
解决方案
您可以链接groupBy
和map
方法首先按键、地址和类名进行分组,然后再做一个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>
推荐阅读
- java - Eclipse 自动完成功能不适用于某些源文件
- javascript - 我想制作一个记录丢失图像的脚本
- kubernetes - kustomize:如何从命令行传递`newTag`
- wso2 - 具有多个参数的 WSO2 MI dataService 嵌套查询
- node.js - 从其文件夹安装本地 NPM 包会忽略包的“文件”配置
- redux - `dispatch` 方法的类型签名不正确,尽管使用了“app dispatch”钩子
- javascript - 从平面列表中删除对象的麻烦
- reactjs - react-select onChange 如何访问用户输入而不选择选项值?
- javascript - 在启动时以 PDF 形式启动 JavaScript(使用 hyperref 生成)
- python - 在 cmd python 中显示已安装 python 2.7 但是当我编写 python2 时它显示它不被识别为内部文件或命令