在前端开发中,我们经常需要将数据按照某些条件进行分组。Underscore.JS是一个很好的JavaScript库,它提供了许多方便的函数来处理集合数据,包括分组函数。本文将介绍如何使用Underscore.JS的groupBy函数对多个值进行分组,同时保留原始键和值。
groupBy函数简介
首先,让我们看一下groupBy函数的基本语法:
_.groupBy(list, iteratee, [context])
该函数接受三个参数:
list
: 要分组的集合数据。iteratee
: 一个迭代函数,它会被应用到每个元素上以确定其所属的组别。context
(可选): 迭代函数的上下文。
groupBy函数将返回一个对象,其中每个属性都是一个数组,包含具有相同组别的元素。
按单个值进行分组
让我们从最简单的情况开始,假设我们有以下一组名字和成绩数据:
var scores = { 'Alice': 90, 'Bob': 80, 'Charlie': 70, 'David': 80, 'Eve': 90 };
如果我们想按照成绩将这些人分组,可以使用以下代码:
var grouped = _.groupBy(scores, function (value, key) { return value; });
这将产生以下结果:
{ '70': [{ 'Charlie': 70 }], '80': [{ 'Bob': 80 }, { 'David': 80 }], '90': [{ 'Alice': 90 }, { 'Eve': 90 }] }
注意到每个分组都包含一个对象,该对象的键是成绩值,而值是一个数组,其中包含具有相同成绩值的人名。
按多个值进行分组
现在假设我们有一个更复杂的数据集,其中每个对象都有两个属性:name和score。我们想按照score和name将这些对象分组,并且仍然保留原始的键和值。例如,如果我们有以下数据:
-- -------------------- ---- ------- --- ------ - - -------- --- ------ --- ---------- --- -------- --- ------ -- -- --- ---- - ------------- -------- ------- ---- - ------ - ----- ---- ------ ----- -- ---
那么我们可以使用以下代码对数据进行分组:
-- -------------------- ---- ------- --- ------- - --------------- -------- ------ - ------ ---------- - --- - ---------- --- --- ------ - --- --------------- -------- ------- ---- - --- ----- - --------------- --- ----- - ------------------- --- ---- - --------- -- ---------------- - ------------- - --- - ------------------- - --------------- ---
这将产生以下结果:
{ '70': { 'Charlie': 70 }, '80': { 'Bob': 80, 'David': 80 }, '90': { 'Alice': 90, 'Eve': 90 } }
注意到每个分组现在都是一个对象,其中键是人名,值是成绩。我们使用split函数将组合的键拆分成原始值,并从每个元素中提取出name和score属性。然后,我们使用if语句来创建新的score属性(如果还不存在),并将得分添加到相应的name属性中。
总结
Underscore.JS提供了强大而灵活的groupBy函数,使我们可以轻松地对集合数据进行分组。通过了解如何按多个值进行分组,我们可以更有效地处理更复杂的数据结构,并保留原始键和值。希望这
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/31603