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

时间:2017-05-14 17:51:51

标签: javascript ecmascript-6

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

书,汽车和轮子。

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

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

轮子,书,车

假设属性名称是name ...

我试过这样的事情:

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

        return -1;

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

由于您只期望这三个字符串中的实例(仅在myitem中),您可以在有序数组上使用filter,并使用Set#has测试这些输入字符串是否存在:< / p>

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

&#13;
&#13;
// 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);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您的代码看起来大多正确。我修改了格式等,并颠倒了sort函数中的符号。

当然,此处理具有这三个确切名称的项目。如果你需要处理其他输入,你必须决定应该发生什么。

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