如何在JavaScript中利用高阶函数sort()基于数组对象计算值排序
按友谊时长直接排序的解决方案
你的错误点分析
你尝试的代码存在两个关键问题:
friends.end - friends.start写法错误,friends是数组而非单个朋友对象,无法直接访问end和start属性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
相关产品推荐
相关产品推荐

