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

如何在JavaScript中利用高阶函数sort()基于数组对象计算值排序

按友谊时长直接排序的解决方案

你的错误点分析

你尝试的代码存在两个关键问题:

  1. friends.end - friends.start 写法错误,friends是数组而非单个朋友对象,无法直接访问end和start属性
  2. c1.compDuration 字段不存在,你并未给对象添加这个属性,属于无效引用

正确的一步到位写法(普通函数版)

无需提前给对象添加friendshipDuration字段,直接在sort的回调函数中计算每个对象的友谊时长并比较:

const sortedfriends2 = friends.sort(function(c1, c2) {
  // 分别计算两个朋友的友谊时长
  const duration1 = c1.end - c1.start;
  const duration2 = c2.end - c2.start;
  // 根据时长差值决定排序位置
  if (duration1 > duration2) {
    return 1; // c1排到c2后面
  } else {
    return -1; // c1排到c2前面
  }
});
console.log(sortedfriends2);

简化为箭头函数写法

你提到的(c1,c2)=>c1-c2是利用了sort回调的特性:返回值大于0则交换两个元素位置,小于0则保持顺序,等于0则不变。我们可以直接返回两个时长的差值来简化代码:

// 升序排序(时长较短的朋友在前)
const sortedAsc = friends.sort((c1, c2) => (c1.end - c1.start) - (c2.end - c2.start));

// 降序排序(时长较长的朋友在前),反转差值即可
const sortedDesc = friends.sort((c1, c2) => (c2.end - c2.start) - (c1.end - c1.start));

补充说明

sort方法会直接修改原数组,如果不想改变原数组,建议先创建数组副本再排序:

// 用扩展运算符创建原数组的副本
const sortedfriends2 = [...friends].sort((c1, c2) => (c1.end - c1.start) - (c2.end - c2.start));

内容的提问来源于stack exchange,提问作者mika2019

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:05:21