【问题标题】:Sort array of objects对对象数组进行排序
【发布时间】:2011-08-18 02:22:50
【问题描述】:

我有一个这样的对象字面量数组:

var myArr = [];

myArr[0] = {
   'score': 4,
   'name': 'foo'
}

myArr[1] = {
   'score': 1,
   'name': 'bar'
}

myArr[2] = {
   'score': 3,
   'name': 'foobar'
}

我将如何对数组进行排序,使其按 'score' 参数升序,从而变为:

myArr[0] = {
   'score': 1,
   'name': 'bar'
}

myArr[1] = {
   'score': 3,
   'name': 'foobar'
}

myArr[2] = {
   'score': 4,
   'name': 'foo'
}

提前致谢。

【问题讨论】:

  • 您正在对一组对象进行排序。它们不再是文字了。

标签: javascript jquery arrays object object-literal


【解决方案1】:

试试myArr.sort(function (a, b) {return a.score - b.score});

数组元素的排序方式取决于传入的函数返回的数字:

  • < 0(负数):a 领先于b
  • > 0(正数):b 领先于a
  • 0:在这种情况下,这两个数字将在排序列表中相邻。但是,不能保证排序是稳定的:ab 相对于彼此的顺序可能会发生变化。

【讨论】:

  • +1。请参阅 this reference 了解为什么使用 - 而不是 <
  • @Tomalak Geret'kal:在您输入评论时,我添加了一段解释。希望我很清楚。不过,这是一个很好的参考!
  • 谢谢,但遗憾的是它没有用。也没有: myArr.sort(function (a, b) {myArr[a].score - myArr[b].score});
  • 哎呀,忘了return。我的错。修正了答案;它现在可以工作了!
  • Scheme 和 Haskell 玩的太多了 :(
【解决方案2】:

您可以查看 MDN 上的 Array.sort documentation。特别是在有关提供自定义 compareFunction 的文档中

【讨论】:

    【解决方案3】:

    const myArray = [  
        {
       'score': 4,
       'name': 'foo'
    },{
       'score': 1,
       'name': 'bar'
    },{
       'score': 3,
       'name': 'foobar'
    }
    ]
    
    const myOrderedArray = _.sortBy(myArray, o => o.name);
    console.log(myOrderedArray);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

    lodash sortBy

    【讨论】: