lodash Groupby基于多种条件

时间:2018-02-02 07:31:41

标签: javascript angular lodash angular2-services

我正在为我的一个项目使用角度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);

如何解决这个问题。请帮忙。

2 个答案:

答案 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;
&#13;
&#13;

如果您的对象中可能有多个其他内容,您可以执行以下操作

&#13;
&#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;
&#13;
&#13;

答案 1 :(得分:0)

类似的东西:

const res = _.chain(arr)
    .groupBy('age')
    .mapValues(ageArr => _.groupBy(ageArr, ageObj => ageObj.details[0].address))
    .value();