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数组排序方法中的参数顺序不直观的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript sort() 方法

JavaScript中数组Array.sort()排序方法详解

JS中的数组排序函数sort()

javascript sort()对数组中的元素进行排序

JS-sort

javascript原生方法集锦