javascript - lodash 基于多种条件的 Groupby

标签 javascript angular lodash angular2-services

我在我的一个项目中使用 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/

相关文章:

javascript - 通过id改变图片

javascript - 二维数组中增强的 for 循环 - JavaScript

javascript - Kendo 网格拖放不适用于较少数量的记录

angular - chartjs + Angular6 不显示图表或任何错误

Angular - APP_INITIALIZER - Promise 与 Observable

javascript - 在 Angular 9 中创建具有动态 styleUrls 的组件

javascript - 努力将结果从工厂返回到示波器

javascript - 如何将新用户添加到我的 userDatabase 对象中

java - Lodash 模板引擎 Nashorn

javascript - 使用 lodash 从数组中删除两个值(如果重复)