.sort 函数是否会更改原始数组?

新手上路,请多包涵

我有那个代码:

 arr = arr.sort(function (a, b) {
    return a.time>b.time
})

我需要重新定义 arr 还是可以只调用 sort 函数?像这样:

 arr.sort(function (a, b) {
    return a.time>b.time
})

sort 和 filter 函数会改变原始数组吗?

原文由 Prosto Trader 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

使用 slice() 对原始数组的 副本 进行排序。

 var arr =[{time:4},{time:3},{time:6}];

arr.sort(function (a, b) {
  return a.time-b.time;
});

将改变原始数组并返回:

[{时间:3},{时间:4},{时间:6}]

console.log(arr) 返回

[{时间:3},{时间:4},{时间:6}]

var arr =[{time:4},{time:3},{time:6}];
arr.slice().sort(function (a, b) {
  return a.time-b.time;
});

回报

[{时间:3},{时间:4},{时间:6}]

但不会影响原来的数组。

console.log(arr) 返回

[{时间:4},{时间:3},{时间:6}]

原文由 LexJacobs 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个体面的问题,让我们正确地回答它:

 const a = [1, 2, 3];
const b = a.sort();
console.log(a === b); // true

有你的答案。对象的 === 运算符将比较内存位置,因此它是内存中的同一个对象。

这是一种耻辱,因为如果 sort 创建一个新数组(不变性等)会更好,但在许多语言中它不会返回一个新数组,而是返回相同的数组(重新排序)。

所以如果你想让它不可变,你可以这样做:

 const a = [1, 2, 3];
const b = a.slice(0).sort();

原文由 Alexander Mills 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏