【问题标题】:Order of parameters in javascript array sort method is not intuitivejavascript数组排序方法中的参数顺序不直观
【发布时间】: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() 在什么时间选择哪一个(我知道这无关紧要),但不同的算法会以不同的顺序选择项目。

标签: javascript arrays sorting


【解决方案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 非常有帮助。感谢您花时间解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多