array.sort() 以相同的方式对所有内容进行排序

我正在尝试通过进行以下练习来练习:

编写一个函数,它接受一个数值数组并返回一个包含两个数组的对象。第一个应该按升序排列元素,第二个应该按降序排列元素。

这是没有验证部分的代码(我知道这不会造成任何麻烦):

function ascDesc(arr) {

   let ascending = arr.sort((a,b) => a - b);

   let descending = arr.sort((a,b) => b - a);

    

   console.log({ ascending, descending });

 }


ascDesc([7,5,2,7,8,6,10,-10]);

这将返回以相同方式排序的两个数组。我知道.sort()不会返回新数组,我假设这与此有关,但我仍然不明白为什么会这样,因为我将内容存储在两个单独的变量中。

有人可以帮我理解吗?我已经通过在方法.map(e => e)之前添加来解决它.sort()。尝试在此处进行谷歌搜索,但似乎找不到答案,MDN 也无济于事。


开满天机
浏览 127回答 2
2回答

翻阅古今

如您所见,我已经使用 SOSnippet 更新了您的问题,并且控制台日志显示这descending实际上只是参考ascending- 这意味着它们在内存中是相同的项目 - 改变一个也会改变另一个。意味着你必须先做你的数组的浅拷贝.slice()function ascDesc(arr) {   let ascending = arr.slice().sort((a,b) => a - b);   let descending = arr.slice().sort((a,b) => b - a);       console.log({ ascending, descending }); }ascDesc([7,5,2,7,8,6,10,-10]);

慕码人2483693

在 Javascript 中,数组变量是通过引用传递的,这意味着您的ascending, descending, 和arr都指向相同的内存引用和值。一个简单的解决方案是使用扩展运算符将您的数组克隆到一个新的引用中可以解决您的问题:function ascDesc(arr) {   let ascending = [...arr].sort((a,b) => a - b);   let descending = [...arr].sort((a,b) => b - a);       console.log({ ascending, descending, arr }); }ascDesc([7,5,2,7,8,6,10,-10]);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript