【问题标题】:js array sort not working properly [closed]js数组排序无法正常工作[关闭]
【发布时间】:2015-01-12 20:17:04
【问题描述】:

我正在对一组对象进行排序,但我的评估中的某些内容无法正常工作。任何见解都会非常有帮助,我开始在圈子里工作。

temp = [{name: 'M12-20'}, {name: 'M20-25'}];

a[field] = "M12-20"
b[field] = "M20-25"

temp.sort(function(a, b) {
    var one = /[MFP]\d{2}/.exec(a[field]) || /[MFP]\d{1}/.exec(a[field]);
    var two = /[MFP]\d{2}/.exec(b[field]) || /[MFP]\d{1}/.exec(b[field]);

    return ( one[0] > two[0]  ? 1 : -1);
  });

【问题讨论】:

  • .exec() 方法在匹配时返回一个 array。 (另外还不清楚您希望这些东西如何排序;仅仅是数值吗?)
  • 对,我一直在做 return( one[0] > two[0] ? 1 : -1; to no lucky
  • 如果我们不知道temp 中的内容,我们应该如何回答这个问题?请向我们展示一个可重现的示例:*.com/help/mcve
  • @JLRishe 是的,我还没有完全掌握那部分......
  • @atlMapper 我们可以假设field的值为"name"吗?

标签: javascript ecmascript-6


【解决方案1】:

我只能假设您尝试做的是从每个值中提取第一个数字并比较它们,但如果是这样,那么您做错了。如果有匹配,a[0]b[0] 将产生整个匹配值。

您对 Regex 的使用也比它需要的复杂。

试试这个:

var temp = [{name: 'M12-20'}, {name: 'M20-25'}],
    field = 'name',
    r = /[MFP](\d\d?)/;

temp.sort(function(a, b) {
    var one = r.exec(a[field]) || [,NaN],
        two = r.exec(b[field]) || [,NaN];

    return one[1] - two[1];
});

仅供参考(附注)- 在排序比较函数中使用 return condition ? -1 : -1; 几乎总是错误的。如果两个值顺序相等,则该函数需要返回0。忽略这一点可能会导致错误的结果、低效的行为,或者如果你真的很不走运,则会导致无限循环。

【讨论】:

  • 您绝对正确,我正在尝试比较数字直到每个值的破折号。字符串中的破折号导致比较失败。
  • @atlMapper 实际上是字符串中的M 抛出了比较。
  • 啊...我明白你的说法以及你的解决方案是如何工作的(我认为)。寻找两个数字的贪婪正则表达式,要么构建一个结果数组,要么给出一个空数组进行比较。谢谢
  • 仅供参考,旁注是错误的:请阅读:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @Skywalker 这些台词与我所说的有何矛盾?他们使用return condition ? -1 : 1; 吗?他们看起来不像。不,这些台词几乎完全证实了我所说的。
【解决方案2】:

试试这个:

var temp=[];
temp[1]="Apple";
temp[2]="Orange";
temp[3]="Banana";

temp.sort(function(a, b) {
  return return (a < b) ? 1 : -1;  
});

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

if (a is less than b by some ordering criterion) {
  return -1;
}
if (a is greater than b by the ordering criterion) {
  return 1;
}
// a must be equal to b
return 0;

【讨论】:

  • 与您从 MDN 引用的 sn-p 相反,如果 ab 相等,您的函数将返回 1。我也看不出这个答案与上面提出的具体问题有什么关系。
  • 这并不能改变您的回答中有错误陈述的事实。我的答案的后半部分解释了可能的返回值。您可能同意,retun 值是问题的本质。你没答对。
  • 您还没有解释我的回答有什么不正确之处。它not 不正确,原因与您的答案is 不正确相同。我认为您需要提高阅读技巧,因为您既误解了我的观点,也误解了 OP 问题的要点。提问者不需要向他/她解释分类的基础知识。他/她已经明白了很多就好了。