【问题标题】:How to group multiple values in a key belonging to an object in Javascript?如何在属于Javascript中的对象的键中对多个值进行分组?
【发布时间】:2015-02-21 23:12:34
【问题描述】:

我正在尝试在 lodash 中复制 groupBy 方法。这是我的代码:

var array = [1.1,1.3,2.3,2.5,3.1,3.5];
function groupBy (collection, func) {
    var result = {};
    for (var i=0; i<array.length; i++) {
        var property = func(array[i])
        if ((property in result) === property) {
            result[property] = array[i];
        } else {
            result[property] = array[i];
        }
    }
     return result;
}

console.log(groupBy(array, function(n){return Math.floor(n) }));

我遇到的问题是属于键的值正在使用我的第一个 if 分支替换,但我不确定如何更改此分支以使每个键列出与其关联的多个值。我的输出是 {'1':1.3, '2':2.5, '3':3.5},但应该是 {'1':1.1, 1.3... 等等。

谢谢!

【问题讨论】:

    标签: javascript function group-by key-value lodash


    【解决方案1】:

    您不能像这样在单个对象属性上存储多个值,您需要某种集合数据结构,例如数组。

    var array = [1.1,1.3,2.3,2.5,3.1,3.5];
    function groupBy (collection, func) {
      var i, property, result = {};
    
      for (i = 0; i < collection.length; i++) {
        property = func(array[i])
    
        if (!(property in result)) {
          result[property] = [];
        }
    
        result[property].push(array[i]);
      }
    
      return result;
    }
    
    console.log(groupBy(array, function(n){return Math.floor(n) }));
    

    【讨论】:

      【解决方案2】:

      像这样?

      var array = [1.1,1.3,2.3,2.5,3.1,3.5];
      function groupBy (collection, func) {
          var result = {};
          for (var i=0; i<array.length; i++) {
              var property = func(array[i])
              if (!result[property]) result[property]=[];
              result[property].push(array[i]);
          }
           return result;
      }
      
      console.log(groupBy(array, function(n){return Math.floor(n) }));
      

      【讨论】:

      • 是的!我没有意识到这个值实际上是一个数组。我在 else 语句中添加了它以使其适用于我的代码: var array = [1.1,1.3,2.3,2.5,3.1,3.5];函数 groupBy (collection, func) { var result = {}; for (var i=0; i
      【解决方案3】:

      这是您的代码的更正版本:

      function groupBy (collection, func) {
          var result = {};
          for (var i=0; i<array.length; i++) {
              var property = func(array[i])
              //if ((property in result) === property) {
              if (!(property in result)) {
                  result[property] = [array[i]];
              } else {
                  //result[property] = array[i];
                  result[property].push(array[i]);
              }
          }
           return result;
      }
      

      还有一个使用 Map 的不同实现。

      var numbers = [1.1, 1.3, 2.3, 2.5, 3.1 ,3.5];
      
      var result = groupBy(numbers, Math.floor);
      
      console.log(result); //Map {1 => [1.1, 1.3], 2 => [2.3, 2.5], 3 => [3.1, 3.5]}
      
      function groupBy(arr, getKeyFrom) {
         return arr.reduce(function (groupedItems, item) {
           var key = getKeyFrom(item);
      
           if (groupedItems.has(key)) groupedItems.get(key).push(item);
           else groupedItems.set(key, [item]);
      
           return groupedItems;
      
         }, new Map());
       }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 2018-11-23
        相关资源
        最近更新 更多