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

How to group multiple values in a key belonging to an object in Javascript?

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

谢谢!

像这样?

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

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

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

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

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