2015-02-21 2 views
0

Я пытаюсь реплицировать метод groupBy в lodash. Вот мой код:Как сгруппировать несколько значений в ключе, принадлежащем объекту в Javascript?

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

Проблема у меня в том, что стоимость принадлежащая к ключу заменяется использование моего первым, если филиал, но я не уверен, как изменить эту ветку, чтобы сделать каждую клавишу укажите несколько значений, связанных с ним. Мой вывод: {'1': 1.3, '2': 2.5, '3': 3.5}, но должен быть {'1': 1.1, 1.3 ... и т. Д.

Спасибо!

ответ

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

Да! Я не понимал, что это действительно массив. Я добавил в оператор else, чтобы он работал для моего кода: var array = [1.1,1.3,2.3,2.5,3.1,3.5]; функция группаBy (коллекция, func) { var result = {}; for (var i = 0; i

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.

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

Смежные вопросы