在数据处理中,我们经常需要对数组中的元素进行分组。然而,有时分组的逻辑并非基于简单的属性值相等,而是要求只有当某个属性的值与前一个元素的该属性值不同时,才开始一个新的分组。如果值相同,则当前元素应归入上一个分组。这与常见的去重或按属性值聚合有所不同,它强调的是“连续性”和“顺序性”。
例如,给定以下数据结构:
[ {name: A, number: 1, order: 1}, {name: B, number: 1, order: 2}, {name: C, number: 1, order: 3}, {name: D, number: 2, order: 4}, {name: E, number: 2, order: 5}, {name: F, number: 1, order: 6} ]
我们的目标是将其转换为:
[ [ {name: A, number: 1, order: 1}, {name: B, number: 1, order: 2}, {name: C, number: 1, order: 3}, ], [ {name: D, number: 2, order: 4}, {name: E, number: 2, order: 5}, ], [ {name: F, number: 1, order: 6} ] ]
可以看到,number 属性为 1 的前三个对象被分到一组,接着 number 属性变为 2,因此 D 和 E 形成新组。最后,number 属性再次变为 1,F 独立形成一个新组。这种分组方式严格依赖于元素的相对顺序。
Array.prototype.reduce() 方法是处理数组累积和转换的强大工具。它遍历数组的每个元素,并将其“缩减”为单个值(可以是任何类型,包括数组或对象)。在本例中,我们将利用 reduce 来构建一个包含多个子数组的数组,每个子数组代表一个连续的分组。
立即学习“Java免费学习笔记(深入)”;
reduce 方法接受一个回调函数和一个可选的初始值。回调函数通常有四个参数:
通过巧妙地利用 currentIndex 和 array 参数,我们可以访问到当前元素的前一个元素,从而判断是否需要开始一个新的分组。
以下是实现上述分组逻辑的 JavaScript 代码示例:
const data = [ {"name":"A","number":1,"order":1}, {"name":"B","number":1,"order":2}, {"name":"C","number":1,"order":3}, {"name":"D","number":2,"order":4}, {"name":"E","number":2,"order":5}, {"name":"F","number":1,"order":6} ]; let result = data.reduce((accumulator, currentObject, currentIndex, sourceArray) => (sourceArray[currentIndex - 1]?.number !== currentObject.number ? accumulator.push([currentObject]) : accumulator[accumulator.length - 1].push(currentObject), accumulator), []); console.log(result);
代码解析:
data.reduce((...), []):
回调函数参数:
核心逻辑:sourceArray[currentIndex - 1]?.number !== currentObject.number:
条件分支:? accumulator.push([currentObject]) : accumulator[accumulator.length - 1].push(currentObject):
逗号表达式:, accumulator:
通过巧妙地运用 Array.prototype.reduce() 方法结合索引访问和可选链操作符,我们可以高效地解决按顺序对连续相同属性值进行分组的问题。这种方法不仅代码简洁,而且执行效率高,是处理类似数据转换场景的强大工具。理解其背后的逻辑,特别是对 reduce 累加器状态的管理和对前一个元素的判断,是掌握此技巧的关键。
以上就是JavaScript 数组分组技巧:按顺序连续属性值分组对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号