如何按特定顺序排序 - 数组原型(不按值或按名称)



我希望按特定顺序对三个字符串的数组进行排序。

书,汽车和轮子。

我可以按任何顺序接收这些字符串。可能有一个或多个字符串 - 最多三个

如果收到一个或多个字符串,我想按以下确切顺序对字符串进行排序。

轮子, 书, 汽车

假设属性名称为名称...

我尝试了这样的事情:

myitem.sort((a, b) => {
        if(a.name === 'wheel')
          return 1;
        if(a.name === 'book' && b.name === 'car')
          return 1;
        return -1;

您可以使用具有值顺序及其顺序的对象。使用默认值,可以将未指定的值移动到数组的开头或结尾。

var order = { wheel: 1, book: 2, car: 3, default: 1000 },
    array = ['foo', 'car', 'book', 'wheel'];
    
array.sort(function (a, b) {
    return (order[a] || order.default) - (order[b] || order.default);
});
console.log(array);

由于您只期望这三个字符串的实例(myitem(,因此您可以在有序数组上使用filter,并使用Set#has测试这些输入字符串的存在:

var result = ['wheel', 'book', 'car'].filter(function (s) { 
    return this.has(s) 
}, new Set(myitem));

// Sample data being received
var myitem = ['car', 'wheel'];
var result = ['wheel', 'book', 'car'].filter(function (s) { 
    return this.has(s) 
}, new Set(myitem));
// ordered result
console.log(result);

你的代码看起来基本正确。我修复了格式等,并在排序功能中反转了符号。

当然,这处理对具有这三个确切名称的项目进行排序。如果您需要处理其他输入,则必须决定这些输入应该发生什么。

var myitems = [
  {
    name: "book",
  },
  {
    name: "wheel",
  },
  {
    name: "car",
  },
];
console.log(
  myitems.sort((a, b) => {
    if (a.name === "wheel") {
      return -1;
    }
    if (a.name === "book" && b.name === "car") {
      return -1;
    }
    return 1;
  })
);

另一种选择:indexOf。未定义的值显示在列表顶部,但这些值不存在。可能比具有索引值的对象慢,但如果顺序发生变化,尤其是列表变大,则可能更容易维护。

indexOfSort = (a, b) => {
  const order = [
    "wheel",
    "book",
    "car"
  ];
  return order.indexOf(a) - order.indexOf(b);
}
console.log(
['foo', 'car', 'book', 'wheel'].sort(indexOfSort)
);

相关内容

  • 没有找到相关文章

最新更新