lodash Groupby 基于多种条件

lodash Groupby based on multiple conditions

我正在为我的一个项目使用 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} 并将其字符串化以识别组合。但是,我强烈建议不要使用任何管道或任何东西作为分隔符,并加入它们以创建独特的字符串组合以找到一个组。有时这会破坏你的价值。

这是您需要的:

_(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>

类似于:

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