为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2023-03-18 17:45:20
我正在尝试通过进行以下练习来练习:编写一个函数,它接受一个数值数组并返回一个包含两个数组的对象。第一个应该按升序排列元素,第二个应该按降序排列元素。这是没有验证部分的代码(我知道这不会造成任何麻烦):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 也无济于事。
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

如您所见,我已经使用 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]);


查看完整回答
反对 回复 2023-03-18
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

在 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]);


查看完整回答
反对 回复 2023-03-18
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信