javascript数组排序方法中的参数顺序不直观
Posted
技术标签:
【中文标题】javascript数组排序方法中的参数顺序不直观【英文标题】:Order of parameters in javascript array sort method is not intuitive 【发布时间】:2022-01-17 13:44:04 【问题描述】:所以我创建了两个对象:
var obj1 =
"id" : 123,
"name" : "Hello"
var obj2 =
"id" : 456,
"name" : "Goodbye"
然后我将它们插入到一个数组中:
var arr = [obj1, obj2];
然后我将排序结果存储到一个变量中并记录到控制台:
var test = arr.sort(function(x, y)
console.log("x ", x)
console.log("y ", y)
);
console.log(test);
结果是:
x id: 456, name: 'Goodbye'
y id: 123, name: 'Hello'
我希望顺序与数组中对象的出现相同,因为我没有定义任何排序标准。为什么是这样的顺序?
【问题讨论】:
“为什么是这样的顺序?”为什么顺序很重要? @VLAZ 我期待参数“x”对应于数组元素 0,参数“y”对应于数组元素 1。顺序并不“重要”我只是想理解为什么它们不对应。 因为您环境中的排序算法决定按该顺序选取元素。 语言标准不支持某种排序算法,只是从排序函数中返回一个值,表示两个项目的所需顺序。更多在这里 ->Array#sort
据我了解,.sort() 中使用的排序算法取决于数据,它选择“最佳”算法,可能是冒泡排序、快速排序、选择排序或诸如此类。我不确定 .sort() 在什么时间选择哪一个(我知道这无关紧要),但不同的算法会以不同的顺序选择项目。
【参考方案1】:
sort() documentation,从文档中它是实现定义的,以防您不提供有效的排序功能,如果您想保持相同的方式,您可以返回 0
var obj1 =
"id" : 123,
"name" : "Hello"
var obj2 =
"id" : 456,
"name" : "Goodbye"
var arr = [obj1, obj2];
var test =arr.sort((x,y)=>
console.log("x ", x)
console.log("y ", y)
return 0;
)
/* var test = arr.sort(function(x, y))
console.log("x ", x)
console.log("y ", y)
return 0;
); */
console.log(test);
【讨论】:
【参考方案2】:如果您只需要输入 arr 并在排序后按回车键,您会看到数组仍然按照“hello”的顺序,然后“goodbuy”排序并没有改变数据,因为没有办法系统来比较对象,除非您创建一个比较函数来进行排序调用。
您提供的比较函数只打印正在比较的第一个和第二个值。
看到您无法将第一个值与任何内容进行比较,即它没有任何可渗透的内容与它进行比较,从第二个条目开始并继续...我需要将其与某些东西进行比较...让我们尝试第一个元素。
如果您必须添加更多元素,您会清楚地看到这一点。
var arr = [
"id" : 123,
"name" : "Hello"
,
"id" : 456,
"name" : "Goodbye"
,
"id" : 999,
"name" : "Its clear now"
];
var test = arr.sort(function(x, y)
console.log("x ", x)
console.log("y ", y)
);
console.log(test);
如您所见,它将第二个与第一个进行比较,然后将第三个与第二个进行比较。排序完成。
对数字做同样的事情并实际排序
你得到
位置 2 与位置 1 比较并返回 -1,因此它更小并且必须移动到位置 1
[2,3,1,6,5]
位置 3 与位置 1 比较并返回 -1,因此它更小并且必须移动到位置 1
[1,2,3,6,5]
位置 4 与位置 1 比较并返回 5,因此它更大并且必须保持原位
[1,2,3,6,5]
位置 4 与位置 2 比较并返回 4,因此它更大并且必须保持原位
[1,2,3,6,5]
位置 4 与位置 3 进行比较并返回 3,因此它更大并且必须保持原位
[1,2,3,6,5]
位置 4 前面没有任何东西可以比较,所以我们移动到下一个位置
位置 5 与位置 1(原始数组)比较并返回 2,因此它更大,它使用正常的二分搜索逻辑尝试另一个位置(下一个比较)
[1,2,3,6,5]
最后位置 5 与位置 4 进行比较并返回 -1 所以它知道它必须移动到位置 4
[1,2,3,5,6]
【讨论】:
"所以你可以看到它比较第二和第一然后比较第三和第二"在你有屏幕截图的环境中(我假设是 Chrome)。还有这个输入。这绝对不是 sort 无处不在的工作方式。 @VLAZ 非常正确。我在 Edge(基于铬)中拍摄了屏幕截图。只是更多的一个例子,说明为什么排序会根据问题打印出“意外”值。很高兴指出它在任何地方都不相同,因为那将是一个糟糕的假设。谢谢老兄。 @JacquesRamsden 非常有帮助。感谢您花时间解释。以上是关于javascript数组排序方法中的参数顺序不直观的主要内容,如果未能解决你的问题,请参考以下文章