我希望按特定顺序对三个字符串的数组进行排序。
书,汽车和轮子。
我可以按任何顺序接收这些字符串。可能有一个或多个字符串 - 最多三个
如果收到一个或多个字符串,我想按以下确切顺序对字符串进行排序。
轮子, 书, 汽车
假设属性名称为名称...
我尝试了这样的事情:
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)
);