我正在尝试在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 ......等等。
谢谢!
答案 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
的其他实现。
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;