Write a function “groupBy(array, callback)”

前端 未结 7 1006
醉梦人生
醉梦人生 2020-12-06 19:52

I have a JavaScript task where I have to implement a function \"groupBy\", which, when given an array of objects and a function, returns an object w

相关标签:
7条回答
  • 2020-12-06 20:23
     var list = [{id: "102", name: "Alice"},
                  {id: "205", name: "Bob", title: "Dr."},
                  {id: "592", name: "Clyde", age: 32}];
    
    console.log(groupBy(list, function(i) { return i.id; }));
    console.log(groupBy(list, function(i) { return i.name.length; }));
    

    Here's a link to working example: https://codepen.io/pablo-tavarez/pen/NwjrEZ?editors=0012

    function groupBy(list, callback) {
      var output = {};
      var key
        , i = 0;
    
      // iterate over list of objects
      for ( ; i < list.length; i++ ) {
        // pass the current item to callback and get (current) key
        key = callback(list[i]);
    
        if (output[key]) {
          // handle duplicate keys without overriding -- (optionally make all key value Arrays)
          output[key] = [output[key]];
          output[key].push(list[i]);
        }
        else {
          output[key] = list[i];
        }
      }
    
      return output;
    }
    
    0 讨论(0)
  • 2020-12-06 20:27

    Solution with pure JS:

    var list = [{
        id: "102",
        name: "Alice"
      },
      {
        id: "205",
        name: "Bob",
        title: "Dr."
      },
      {
        id: "592",
        name: "Clyde",
        age: 32
      }
    ];
    
    function groupBy(array, callback) {
      return array.reduce(function(store, item) {
        var key = callback(item);
        var value = store[key] || [];
        store[key] = value.concat([item]);
        return store;
      }, {})
    }
    
    console.log('example 1: ', groupBy(list, function(i) { return i.id; }));
    console.log('example 2: ', groupBy(list, function(i) { return i.name.length; }));

    0 讨论(0)
  • 2020-12-06 20:30

    function groupBy(array, callback) {
      var object = {};
    
      for (var i = 0; i < array.length; i++) {
        var item = array[i];
        var key = callback(item);
    
        if (object.hasOwnProperty(key)) {
          object[key].push(item);
        } else {
          object[key] = [item];
        }
      }
    
      return object;
    };
    
    var list = [
      { id: "102", name: "Alice"},
      { id: "205", name: "Bob", title: "Dr." },
      { id: "592", name: "Clyde", age: 32 }
    ];
    
    var byId = groupBy(list, function(i) {
      return i.id;
    });
    
    console.log(byId);
    
    var byNameLength = groupBy(list, function(i) {
      return i.name.length;
    });
    
    console.log(byNameLength);

    0 讨论(0)
  • 2020-12-06 20:37

    Here is another approach using reduce:

     var list = [{
         id: "102",
         name: "Alice"
       },
       {
         id: "205",
         name: "Bob",
         title: "Dr."
       },
       {
         id: "592",
         name: "Clyde",
         age: 32
       }
     ];
    
    
    
     function groupBy(list, callback) {
       return list.reduce((acc, x) => {
         const key = callback(x);
         if (!acc[key]) {
           return {
             ...acc,
             [key]: [x]
           }
         }
         return {
           ...acc,
           [key]: [...acc[key], x]
         }
    
       }, {})
     }
    
    // callback functions
     function nameLength(obj) {
       return obj.name.length;
     }
    
     function objectProperty(obj) {
       return obj.id
     }
    
    
     console.log('group by name length:', groupBy(list, nameLength));
     console.log('group by Id:', groupBy(list, objectProperty));

    0 讨论(0)
  • 2020-12-06 20:41

    It's a reduce() one-liner. Reduce allows you to loop through the array and append to a new object based on the logic of its callback. In this function a (for accumulated) is the object we're making and c (for current item) is each item in the loop taken one at a time.

    It works especially concisely here because the function to make the object key is passed in:

    var list = [{id: "102", name: "Alice"},
    {id: "205", name: "Bob", title: "Dr."},
    {id: "592", name: "Clyde", age: 32}];
    
    function groupBy(list, Fn) {
        return list.reduce((a, c) => (a[Fn(c)] ? a[Fn(c)].push(c) : a[Fn(c)] = [c], a), {})
    }
    
    var t = groupBy(list, function(i) { return i.id; });
    console.log(t)
    
    var l = groupBy(list, function(i) { return i.name.length; });
    console.log(l)

    0 讨论(0)
  • 2020-12-06 20:44

    You can use Lodash _.groupBy, it does exactly what you ask for. doc here.

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