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

Grouping the elements of an object. (underscore.js)

我有一个对象,如下所示:

[
{"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"}
]

我需要这样分组:

 [    
    [
        [
         {"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"}]
    ]    
]

我正在使用 underscore.js 对对象中的元素进行分组。

 $scope.InitController = function () {      

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

以上代码的输出如下:

[   
        [
         {"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"}]   
]

我需要做什么才能获得如上所示的所需输出。

您的代码生成如下所示的输出:

  [ 
        [
         {"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"}]    
]

你必须 groupBy 两次:

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

我只用 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 不是 return 一个数组,它 return 是一个对象。

   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);

这是一个非常简单的原版函数 JavaScript,它有两个参数:
arr 包含要分组的对象的数组。
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;
}

您将按如下方式使用它:

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"]));