javascript - grouping objects by properties

后端 未结 2 2004
一向
一向 2021-01-20 08:25

my question is somewhat similar to javascript | Object grouping .

my input obj is

[
  {
    \"name\":\"Display\",
    \"group\":\"Technical detals\"         


        
相关标签:
2条回答
  • 2021-01-20 09:02

    You could group the items and the concat all groups in a single array.

    It works by generating an object with the group as property an the items as items in the array.

    In the next step, the object's values are taken and a new array is generated by concatination of the items with Array#reduce.

    {                                                                              // hash
        "Technical detals": [
            {
                name: "Display",
                group: "Technical detals",
                id: "60",
                value: "4"
            },
            {
                name: "OS",
                group: "Technical detals",
                id: "37",
                value: "Apple iOS"
            }
        ],
        Manufacturer: [
            {
                name: "Manufacturer",
                group: "Manufacturer",
                id: "58",
                value: "Apple"
            }
        ]
    }
    

    var data = [{ name: "Display", group: "Technical detals", id: "60", value: "4" }, { name: "Manufacturer", group: "Manufacturer", id: "58", value: "Apple" }, { name: "OS", group: "Technical detals", id: "37", value: "Apple iOS" }],
        groups = Object.create(null),
        result = [];
    
    data.forEach(function (a) {
        groups[a.group] = groups[a.group] || [];
        groups[a.group].push(a);    
    });
    
    result = Object.keys(groups).reduce(function (r, k) {
        return r.concat(groups[k]);
    }, []);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    Or just sort by group.

    var data = [{ name: "Display", group: "Technical detals", id: "60", value: "4" }, { name: "Manufacturer", group: "Manufacturer", id: "58", value: "Apple" }, { name: "OS", group: "Technical detals", id: "37", value: "Apple iOS" }];
    
    data.sort(function (a, b) {
        return a.group.localeCompare(b.group);
    });
    
    console.log(data);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    0 讨论(0)
  • 2021-01-20 09:06

    Without sorting you may group by the provided property (by) as follows;

    function quasiSort(a,by){
      var h = a.reduce((h,e) => h[e[by]] ? (h[e[by]].push(e), h)
                                         : (h[e[by]] = [e], h), {});
      return Object.keys(h).reduce((r,k) => r.concat(h[k]),[]);
    }
    var data = [{ "name":"Display",
                 "group":"Technical detals",
                    "id":"60",
                 "value":"4"
                },
                { "name":"Manufacturer",
                 "group":"Manufacturer",
                    "id":"58",
                 "value":"Apple"
                },
                { "name":"OS",
                 "group":"Technical detals",
                    "id":"37",
                 "value":"Apple iOS"
                }
               ];
               
    console.log(quasiSort(data,"group"));

    0 讨论(0)
提交回复
热议问题