【问题标题】:Sort array of objects by arbitrary list in JavaScript在 JavaScript 中按任意列表对对象数组进行排序
【发布时间】:2018-11-01 00:59:35
【问题描述】:

给定一个这样的对象数组:

objects = [
  { id: 'aaaa', description: 'foo' },
  { id: 'bbbb', description: 'bar' },
  { id: 'cccc', description: 'baz' }
];

还有一个这样的字符串数组:

order = [ 'bbbb', 'aaaa', 'cccc' ];

如何对第一个数组进行排序,以使 id 属性与第二个数组的顺序相匹配?

【问题讨论】:

  • 当任何列表中缺少元素时会发生什么?

标签: javascript arrays sorting


【解决方案1】:

试试这个:

objects.sort(function(a, b){
    return order.indexOf(a.id) - order.indexOf(b.id)
});

假设变量就像你在问题中声明的那样,这应该返回:

[
    { id: 'bbbb', description: 'bar' },
    { id: 'aaaa', description: 'foo' },
    { id: 'cccc', description: 'baz' }
];

(实际上是修改了objects变量)

【讨论】:

  • 如果objects 中有不在orders 数组中的元素,它们会出现在顶部。有没有办法让它们显示在列表的末尾而不是开头?
  • @BarryMichaelDoyle:是的,您需要检查-1 的两个indexOf 值,如果它们 -1,则返回Number.MAX_VALUE
【解决方案2】:

您需要一种将字符串转换为数组中位置的方法,即数组的索引函数。

在较新的浏览器中有一个,但为了向后兼容,如果它不存在,您需要添加它:

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(str) {
    var i;
    for (i = 0; i < this.length; i++) if (this[i] == str) return i;
    return -1;
  }
}

现在您可以通过将字符串转换为索引来对数组进行排序:

objects.sort(function(x,y){ return order.indexOf(x.id) - order.indexOf(y.id); });

演示:http://jsfiddle.net/Guffa/u3CQW/

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多