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

17

我知道我们可以定义自定义排序函数来对 JSON 对象数组进行排序。但是如果顺序既不是 desc 也不是 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;
        }
    }

但是物品的排序顺序出现问题了。这里出了什么问题?


现在它返回什么? - Adjit
如果(a.name === 'n')和(b.name === 'n')都返回1,那似乎是不正确的。 - zzzzBov
2个回答

45

如果您有任意排序顺序,一种选项是将顺序分配给一个数组,然后使用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]

1

1) 在这里可以使用indexOf

const dict = "nau";
var myArray = [
  {
    name: "u",
  },
  {
    name: "n",
  },
  {
    name: "a",
  },
  {
    name: "n",
  },
];

myArray.sort((a, b) => dict.indexOf(a.name) - dict.indexOf(b.name));

console.log(myArray);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; }

2) 在这里你可以使用地图

我在两个字符之间添加了一些空格/间隔,因为它们之间可能会有其他字符,所以你可以在它们之间放置。

const order = {
  n: 100,
  a: 200,
  u: 300,
};

var myArray = [
  {
    name: "u",
  },
  {
    name: "n",
  },
  {
    name: "a",
  },
  {
    name: "n",
  },
];
myArray.sort((a, b) => order[a.name] - order[b.name]);

console.log(myArray);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接