繁体   English   中英

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

[英]custom sort order on array of objects

我知道我们可以定义 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;
        }
    }

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

如果您有任意排序顺序,一个选项是将订单分配给数组,然后使用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)你可以在这里使用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)你可以在这里使用地图

我在两个character之间添加了一些间隙/空间,因为它们之间可能会有其他字符,因此您可以将它们放在它们之间

 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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM