我正在为我的一个项目使用角度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);
如何解决这个问题。请帮忙。
答案 0 :(得分:1)
如果您确定您的对象结构总是完全相同并且details
中只有一个对象,那么您可以直接执行Stringify来识别组合,如果您的对象有多个数据,那么您可以创建一个新对象{age: value, street: 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>
&#13;
如果您的对象中可能有多个其他内容,您可以执行以下操作
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);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
答案 1 :(得分:0)
类似的东西:
const res = _.chain(arr)
.groupBy('age')
.mapValues(ageArr => _.groupBy(ageArr, ageObj => ageObj.details[0].address))
.value();