【问题标题】:custom sort order on array of objects对象数组的自定义排序顺序
【发布时间】:2016-07-05 19:47:44
【问题描述】:

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

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

【问题讨论】:

  • 现在返回什么?
  • if (a.name === 'n')if (b.name === 'n') 都返回 1,这似乎是不正确的。

标签: javascript arrays sorting


【解决方案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]

【讨论】:

    【解决方案2】:

    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)你可以在这里使用Map

    我在两个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; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2018-02-14
      • 2014-04-19
      • 2012-06-24
      相关资源
      最近更新 更多