如何在Javascript中对属于对象的键中的多个值进行分组?

时间:2015-02-21 14:31:44

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

我正在尝试在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 ......等等。

谢谢!

3 个答案:

答案 0 :(得分:0)

喜欢这个吗?

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

答案 1 :(得分:0)

您不能在单个对象属性上存储多个值,您需要某种类似于数组的集合数据结构。

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 :(得分:0)

以下是您的代码的更正版本:

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的其他实现。

&#13;
&#13;
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());
 }
&#13;
&#13;
&#13;