简体   繁体   English

对对象的元素进行分组。 (underscore.js)

[英]Grouping the elements of an object. (underscore.js)

I have an object as shown below : 我有一个对象如下所示:

[
{"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},
{"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},
{"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"},
{"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"},
{"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"},
{"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},
{"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"},
{"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}
]

I need to group it like this : 我需要像这样分组:

 [    
    [
        [
         {"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"}
        ],
        [{"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"}],
        [{"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"}]
    ],
    [
        [
         {"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},
         {"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"}
        ],
        [{"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}]
    ]    
]

I am using underscore.js to group the elements in the object. 我使用underscore.js来分组对象中的元素。

 $scope.InitController = function () {      

   ClientGroupService.GetClientGroupList().then(function (response) {    
    $scope.groupByTwoFields = [];
    $scope.groupByTwoFields = _.groupBy(response.data, function (obj) {
                    return obj.ClientGroupName  + '|' + obj.ControlGroupName;
                });
       .....
   });
};

The output from the above code looks like : 上面代码的输出如下:

[   
        [
         {"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"}
        ],
        [{"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"}],
        [{"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"}],  
        [
         {"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},
         {"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"}
        ],
        [{"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}]   
]

What do I need to do in order to get the desired output as shown above. 如上所示,我需要做什么才能获得所需的输出。

Your code producing the output in the below shown form : 您的代码以下面显示的形式生成输出:

  [ 
        [
         {"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"},
         {"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"},
         {"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"}
        ],  
        [
         {"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},
         {"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"},
        {"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}]    
]

i did it with just vanillaJS in case the answer above didn't work for you: 如果上面的答案不适合你,我只用vanillaJS做到了:

var data = [

        {"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},

        {"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},

        {"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"},

        {"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"},

        {"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"},

        {"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},

        {"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"},

        {"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}

    ];



    var ClientGroupNames = [];

    data.forEach(function(o){

        if(ClientGroupNames.indexOf(o.ClientGroupName) < 0){

            ClientGroupNames.push(o.ClientGroupName);

        }

    });

    var result = ClientGroupNames.map(function(name){

        return data.filter(function(comp){

            return comp.ClientGroupName == name ? true : false;

        })

    }).map(function(grp){

        var groupNames = [];

        grp.forEach(function(company){

            if(groupNames.indexOf(company.ControlGroupName) < 0)

                groupNames.push(company.ControlGroupName);

        })

        return groupNames.map(function(name){

            return grp.filter(function(gp){

                return gp.ControlGroupName == name ? true : false;

            })

        })
    })

_.groupBy doesn't return an array, it returns an object. _.groupBy不返回数组,它返回一个对象。

   var data = [{
  "ClientGroupName": "ABC",
  "CompanyName": "AA",
  "ControlGroupName": "1"
}, {
  "ClientGroupName": "ABC",
  "CompanyName": "BB",
  "ControlGroupName": "1"
}, {
  "ClientGroupName": "ABC",
  "CompanyName": "CC",
  "ControlGroupName": "1"
}, {
  "ClientGroupName": "ABC",
  "CompanyName": "DD",
  "ControlGroupName": "2"
}, {
  "ClientGroupName": "ABC",
  "CompanyName": "EE",
  "ControlGroupName": "3"
}, {
  "ClientGroupName": "DEF",
  "CompanyName": "FF",
  "ControlGroupName": "1"
}, {
  "ClientGroupName": "DEF",
  "CompanyName": "GG",
  "ControlGroupName": "1"
}, {
  "ClientGroupName": "DEF",
  "CompanyName": "HH",
  "ControlGroupName": "2"
}];

var obj = _.groupBy(data,function (obj) {
    return obj.ClientGroupName;
}); // groupBy returns an object, not a array
var result = Object.keys(obj).map(function (key) { return obj[key]; }); // this converts the object to an array

_.each(result,function(obj,index){ // loop through each item in the array
  var _obj = _.groupBy(obj,function(obj2){
    return obj2.ControlGroupName;
  }); // group it by the ControlBroupName and convert it to a array
  result[index] = Object.keys(_obj).map(function (key) { return _obj[key]; });

});

console.log("result:\n", result);

Here's a very simple function to do it in vanilla JavaScript, it takes two arguments: 这是一个非常简单的函数,在vanilla JavaScript中执行它,它有两个参数:
arr The array containing the objects that you want to group. arr包含要分组的对象的数组。
properties An array of strings with the names of the properties you want to group the objects by, ordered by priority (objects will be ordered by the first property in the array, then the second, etc). properties一个字符串数组,其中包含要按对象分组的属性的名称,按优先级排序(对象将按数组中的第一个属性排序,然后是第二个属性等)。

function groupByProperties(arr, properties) {
    const groups = {
        root: {
            array: [],
            children: {}
        }
    };

    arr.forEach(obj => {
        let group = groups.root;
        properties.forEach(propertyKey => {
            const property = obj[propertyKey];
            if (!group.children.hasOwnProperty(property)) {
                const child = {
                    array: [],
                    children: {}
                }
                group.array.push(child.array);
                group.children[property] = child;
            }
            group = group.children[property];
        });
        group.array.push(obj);
    });
    return groups.root.array;
}

You would use it as follows: 您可以按如下方式使用它:

let data = [
    {"ClientGroupName":"ABC","CompanyName":"AA","ControlGroupName":"1"},
    {"ClientGroupName":"ABC","CompanyName":"BB","ControlGroupName":"1"},
    {"ClientGroupName":"ABC","CompanyName":"CC","ControlGroupName":"1"},
    {"ClientGroupName":"ABC","CompanyName":"DD","ControlGroupName":"2"},
    {"ClientGroupName":"ABC","CompanyName":"EE","ControlGroupName":"3"},
    {"ClientGroupName":"DEF","CompanyName":"FF","ControlGroupName":"1"},
    {"ClientGroupName":"DEF","CompanyName":"GG","ControlGroupName":"1"},
    {"ClientGroupName":"DEF","CompanyName":"HH","ControlGroupName":"2"}
];

console.log(groupByProperties(data, ["ClientGroupName", "ControlGroupName"]));

You have to groupBy twice: 你必须两次groupBy

result = _(data).groupBy('ClientGroupName').map(g =>
    _.values(_.groupBy(g, 'ControlGroupName'))
).value()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM