对象数组的自定义排序顺序

时间:2016-07-05 19:47:45

标签: javascript arrays sorting

我知道我们可以定义json对象数组的自定义排序函数。但是如果订单不是desc nor asc怎么办?例如,假设我的数组看起来像:

[ {
    name: 'u'
  },
  {
    name: 'n'
  },
  {
    name: 'a'
  },
  { 
    name: 'n',
  } 
]

输出应如下所示:

[ {
    name: 'n'
  },
  {
    name: 'n'
  },
  {
    name: 'a'
  },
  { 
    name: 'u',
  } 
]

首先排序以n开头的所有名称,然后排序其余名称。我尝试了以下自定义排序功能:

_sortByName(a, b){
        if (a.name === 'n'){
            return 1;
        } else if(b.name === 'n'){
            return 1;
        } else if(a.name < b.name){
            return 1;
        } else if(a.name > b.name){
            return -1;
        }
    }

但是为对象返回的顺序是错误的。这里出了什么问题?

1 个答案:

答案 0 :(得分:16)

如果您有任意排序顺序,一个选项是将订单分配给数组,然后使用indexOf

var sortOrder = ['n', 'a', 'u'];
var myArray = [{
    name: 'u'
  },
  {
    name: 'n'
  },
  {
    name: 'a'
  },
  {
    name: 'n'
  }
];
myArray.sort(function(a, b) {
  return sortOrder.indexOf(a.name) - sortOrder.indexOf(b.name);
});

console.log(myArray);

如果在任一数组中有多个值,则首先创建值索引映射然后使用sortOrder[a.name]可能是值得的。