Javascript-Array分组

77 阅读2分钟

每天一道小练习,防止老年痴又呆

Javascript.jpg 题目简介

编写一段可应用于所有数组的代码,使任何数组调用 array. groupBy(fn) 方法时,它返回对该数组 分组后 的结果。 数组 分组 是一个对象,其中的每个键都是 fn(arr[i]) 的输出的一个数组,该数组中含有原数组中具有该键的所有项。 提供的回调函数 fn 将接受数组中的项并返回一个字符串类型的键。 个值列表的顺序应该与元素在数组中出现的顺序相同。任何顺序的键都是可以接受的。 请在不使用 lodash 的 _.groupBy 函数的前提下解决这个问题。

示例 1:

输入:
array = [
  {"id":"1"},
  {"id":"1"},
  {"id":"2"}
], 
fn = function (item) { 
  return item.id; 
}
输出:
{ 
  "1": [{"id": "1"}, {"id": "1"}],   
  "2": [{"id": "2"}] 
}

示例 2:

输入:
array = [
  [1, 2, 3],
  [1, 3, 5],
  [1, 5, 9]
]
fn = function (list) { 
  return String(list[0]); 
}
输出:
{ 
  "1": [[1, 2, 3], [1, 3, 5], [1, 5, 9]] 
}
解释:
数组可以是任何类型的。在本例中,分组选择方法是将键定义为数组中的第一个元素。
所有数组的第一个元素都是1,所以它们被组合在一起。
{
  "1": [[1, 2, 3], [1, 3, 5], [1, 5, 9]]
}

示例 3:

输出:
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
fn = function (n) { 
  return String(n > 5);
}
输入:
{
  "true": [6, 7, 8, 9, 10],
  "false": [1, 2, 3, 4, 5]
}
解释:
分组选择方法是根据每个数字是否大于 5 来分割数组。

 

提示:

  • 0 <= array.length <= 105
  • fn 返回一个字符串

解题

Array.prototype.groupBy = function(fn) {
  return this.reduce((pre,cur) => {
        pre[fn(cur)] ?  (pre[fn(cur)].push(cur)) : (pre[fn(cur)] = [cur])
        return pre
    }, {})
};

通过 reduce内置方法,可以快速实现分组的目的,当然可以通过其他循环的方法去实现,最终返回的是一个key-value形式的对象

当前题目来自力扣