【问题标题】:why array.sort not work in javascript?为什么 array.sort 在 javascript 中不起作用?
【发布时间】:2016-04-29 23:52:48
【问题描述】:

我有对象数组。我想如果我在数组中添加对象,它应该以排序方式添加。我使用数组进行排序。但它没有对我的数组进行排序。这是我的代码

https://jsfiddle.net/8oczc5x5/

var arr = [{
  elem: {
    text: function() {
      return "aa";
    }
  }
}, {
  elem: {
    text: function() {
      return "yy";
    }
  }
}];
var obj = {
  elem: {
    text: function() {
      return "bb";
    }
  }
}
arr.push(obj);
arr.sort()
console.log(arr[1].elem.text())

预期输出

"bb"

实际输出

"yy" 

..为什么?我使用了排序它应该对我的数组进行排序?

【问题讨论】:

  • Javascript 无法对对象数组进行排序,因为默认情况下,对象集没有被排序。
  • 如果您只尝试使用数字(1、2、3),它可以正常工作。
  • 好的,我们如何对这个数组进行排序
  • 您正试图通过在数组中对象的内部子级调用的函数的results 对数组进行排序?您将需要为 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 编写自定义排序函数
  • @Hamms,很好。语法是arr.sort([fonctionComparaison])

标签: javascript jquery arrays sorting


【解决方案1】:

sort 只有在按字母顺序对字符数据进行排序时才能真正“开箱即用”。为什么你会期望它调用你的函数并比较它们?这真的很危险也很复杂。但是,您可以通过传递一个函数来执行您自己的特殊排序。

取自文档(compareFunction 是您传入的函数):

如果提供了compareFunction,则数组元素根据比较函数的返回值进行排序。如果 a 和 b 是两个被比较的元素,那么:

如果compareFunction(a, b) 小于0,则将a 排序到比b 低的索引,即a 排在第一位。

如果compareFunction(a, b) 返回0,则a 和b 彼此保持不变,但对所有不同元素进行排序。注意:ECMAscript 标准不保证这种行为,因此并非所有浏览器(例如,至少可以追溯到 2003 年的 Mozilla 版本)都尊重这一点。

如果compareFunction(a, b) 大于0,则将b 排序到比a 低的索引。 compareFunction(a, b) 在给定一对特定元素 a 和 b 作为其两个参数时,必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。

arr.sort(function(a, b) {
  // localeCompare does a string comparison that returns -1, 0, or 1
  return a.elem.text().localeCompare(b.elem.text());
});

【讨论】:

  • s/localCompare/localeCompare
  • @user944513 为什么?您可以从字面上删除它来代替您当前的 arr.sort() 呼叫。
  • “排序仅在对数字和字符进行排序时“开箱即用”才能真正起作用” - 不,它只能“开箱即用”工作关于字符数据。它不会按数字对数字进行排序,您必须为此提供一个比较函数。
  • 感谢 localeCompare 的建议。当返回 a - b 行为不端时,这有助于我的咖啡脚本编译的 javascript 正常工作。
【解决方案2】:
function sortNumber(num1,num2) {return num1 - num2;} var numbs = [5, 17, 29, 48, 4, 21]; 
var sortnumb = numbs.sort(sortNumber);
alert(sortnumb)

【讨论】:

  • 欢迎来到 StackOverflow:如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ( { } ) 或使用 Ctrl键盘上的 +K 可以很好地格式化和语法突出显示它!
  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
  • @WhatsThePoint 重点(相反)是即使没有解释,它对我解决我的问题很有用。程序员也可以理解丑陋的代码,而不仅仅是机器。不过,我同意解释会有所帮助。
【解决方案3】:

你必须指定如何排序

arr.sort(function(a,b){
   a=a.elem.text();
   b=b.elem.text();
   return a > b ? 1 : (a < b ? -1 : 0);
})

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多