如何根据对象值总和对JavaScript数组进行升序/降序排序?
问题:根据Val开头字段的总和对数组排序
我有一个包含多个对象的数组,每个对象包含4个(或更多)以Val开头的键值对,以及一个identifier标识符。请问能否根据Val1、Val2、Val3、Val4的总和对数组进行升序或降序重新排序?
示例代码
const array = [ { 'Val1': 10, 'Val2': 20, 'Val3': 30, 'Val4': 40 , // Val1 + Val2 + Val3 + Val4 = 100 'identifier': 'Column1' }, { 'Val1': 20, 'Val2': 30, 'Val3': 40, 'Val4': 50, // Val1 + Val2 + Val3 + Val4 = 140 'identifier': 'Column2' } ];
预期降序结果
const array = [ { 'Val1': 20, 'Val2': 30, 'Val3': 40, 'Val4': 50, // Val1 + Val2 + Val3 + Val4 = 140 'identifier': 'Column2' }, { 'Val1': 10, 'Val2': 20, 'Val3': 30, 'Val4': 40, // Val1 + Val2 + Val3 + Val4 = 100 'identifier': 'Column1' } ];
解决方案
完全可以实现,核心逻辑是先计算每个对象中Val开头字段的总和,再用数组的sort()方法根据总和排序。
1. 通用总和计算函数
这个函数能自动识别所有以Val开头的字段并求和,后续新增Val5、Val6这类字段也不用修改代码:
function calculateValSum(obj) { return Object.keys(obj) .filter(key => key.startsWith('Val')) .reduce((total, key) => total + obj[key], 0); }
2. 降序排序
调用sort()方法传入比较函数,让总和大的对象排在前面:
// 复制原数组避免修改原数据,不需要保留原数组的话可以直接用array.sort(...) const sortedDescending = [...array].sort((a, b) => { const sumA = calculateValSum(a); const sumB = calculateValSum(b); return sumB - sumA; });
3. 升序排序
调整比较函数的返回值,让总和小的对象排在前面:
const sortedAscending = [...array].sort((a, b) => { const sumA = calculateValSum(a); const sumB = calculateValSum(b); return sumA - sumB; });
内容的提问来源于stack exchange,提问作者SHelari
相关产品推荐
相关产品推荐

