我在我的一个项目中使用 Angular 4,并且遇到一种情况,我必须根据多个条件对数据进行分组,如下所述。
原始数据
[
{
age: "12",
details: [
{
address: "street1"
}
]
},
{
age: "12",
details: [
{
address: "street2"
}
]
},
{
age: "12",
details: [
{
address: "street1"
}
]
}]
我想根据年龄和地址字段对数据进行分组,因此结果会类似于
{
stree1: [{
age: "12",
details: [
{
address: "street1"
}
]
}, {
age: "12",
details: [
{
address: "street1"
}
]
}
],
street2: [{
age: "12",
details: [
{
address: "street1"
}
]
}]
}
我知道我们可以使用 lodash 根据单一条件对数据进行分组
_.groupBy(data, 'age');
但我不明白如何根据多种条件执行此操作。我想将所有具有相同地址和相同年龄的对象分组。类似的东西
_.groupBy(data, 'age' && details[0].address);
如何解决这个问题。请帮忙。
最佳答案
如果您确定您的对象结构始终完全相同,并且details
中只有一个对象,那么您可以直接执行 Stringify 来识别组合,如果您的对象有多个数据,然后您可以创建一个新对象 {age: value, street: value}
并将其字符串化以识别组合。但是,我强烈建议不要使用任何管道或任何东西作为分隔符,并将它们连接起来以创建唯一的字符串组合来查找组。有时这会损害你的值(value)。
这是您需要的:
_(rawData).groupBy(JSON.stringify).filter(arr=>arr.length>1).mapKeys(v=>v[0].details[0].address).value( )
这是一个工作示例:
var rawData = [
{
age: "12",
details: [
{
address: "street1"
}
]
},
{
age: "12",
details: [
{
address: "street2"
}
]
},
{
age: "12",
details: [
{
address: "street1"
}
]
}];
var result = _(rawData)
.groupBy(JSON.stringify)
.filter(arr=>arr.length>1)
.mapKeys(v=>v[0].details[0].address)
.value();
console.log('Expected result: ', result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
如果您的对象中可以有多个其他内容,请执行以下操作
var rawData = [
{
age: "12",
details: [
{
address: "street1"
}
]
},
{
age: "12",
details: [
{
address: "street2"
}
]
},
{
age: "12",
details: [
{
address: "street1"
}
]
}];
var result = _(rawData)
.groupBy(obj=>JSON.stringify({age: obj.age, address: obj.details[0].address}))
.filter(arr=>arr.length>1)
.mapKeys(v=>v[0].details[0].address)
.value();
console.log('Expected result: ', result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
关于javascript - lodash 基于多种条件的 Groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48577775/