【问题标题】:sorting array of complex objects in javascript在javascript中对复杂对象数组进行排序
【发布时间】:2014-06-13 11:56:33
【问题描述】:

我有一个对象数组,例如:

var a = [
 { value: 500, name: 'ccc' },
 { value: 100, name: 'bbb' },
 { value: 500, name: 'aaa' },
 { value: 300, name: 'eee' },
];

我需要按 value 字段的降序对它进行排序,如果 value 字段等于 AND - 然后对这两个对象进行排序按字段名称的字母顺序。

我尝试这样的事情:

a.sort(function (a, b) {
    return b["value"] - a["value"] || (a["name"] > b["name"]) ? 1: -1;
});

但这不会导致

500,aaa
500,ccc
300,eee
100,bb

如我所料

【问题讨论】:

  • “不工作”是什么意思?有什么错误吗?
  • @mplungjan 结果的顺序是 300、500、100、500。这不是字段值的降序。
  • 这不是我的结果,我只是粘贴了代码。

标签: javascript


【解决方案1】:

问题是运算符优先级,需要正确括号。

a.sort(function (a, b) {
    return (b["value"] - a["value"]) || ((a["name"] > b["name"]) ? 1: -1);
});

逻辑运算符的优先级高于三元运算符,因此您需要将三元表达式括在括号中。我添加了额外的冗余括号以明确所有内容。

测试结果:

[{"value":500,"name":"aaa"},
 {"value":500,"name":"ccc"},
 {"value":300,"name":"eee"},
 {"value":100,"name":"bbb"}]

DEMO

【讨论】:

  • 你说得对。这是关于运算符优先级的。您建议的解决方案应该可以解决问题。
【解决方案2】:

尝试创建一个单独的函数。

 function compare(a,b) {
  if (a.value< b.value)
     return -1;
  if (a.value> b.value)
    return 1;
  if(a.value == b.value)
    if (a.name< b.name)
     return -1;
  if (a.name> b.name)
    return 1;

  return 0;
}

a.sort(compare);

这是工作示例:http://jsfiddle.net/8ZUdF/

【讨论】:

  • 使其成为一个单独的函数只有一个影响:污染外部命名空间。
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2019-01-08
  • 2023-03-26
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多