You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据对象值总和对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:05:28