我有一个对象数组,我想在我的 Angular 项目中应用自定义排序。
我想要实现的一个简单示例是每个对象都具有属性 id
和 category
。
let cars: { id: number, category: string }[] = [
{ "id": 3, "category": "fast car" },
{ "id": 0, "category": "fast car" },
{ "id": 1, "category": "slow car" },
{ "id": 2, "category": "fast car" }
];
不,我想对数组进行排序。首先,每辆 Fast Car 都应该出现(如果有多个 id 排序),然后是 Slow car(如果有多个 id 排序)。
{ "id": 0, "category": "fast car" }
{ "id": 2, "category": "fast car" }
{ "id": 3, "category": "fast car" }
{ "id": 1, "category": "slow car" }
我真的不明白 .sort 函数是如何工作的。 由于我是编程新手,因此对如何在这种情况下使用 .sort() 进行相当详细的描述会有所帮助。
最佳答案
解释:
既然你要求描述,我会尽力首先尽可能简单地解释它:
应用于数组的 sort
函数通常需要直接比较两个参数并返回一个数字。这个数字可以被视为“小于”(负)、“大于”(正)或“等于”(零)。因此,在您的情况下,该函数将被多次调用。理论上,也可以没有这两个参数,例如对于随机顺序,您可以这样写:cars.sort(() => Math.random() - 0.5)
因此,任何返回数字的函数都可用于对数组进行排序。在您的情况下,它将是:
按定义的类别层次结构排序/在同一类别的情况下使用 ID:
const cars: { id: number; category: string }[] = [
{ id: 3, category: "fast car" },
{ id: 0, category: "fast car" },
{ id: 1, category: "slow car" },
{ id: 2, category: "fast car" }
];
const orderCategory = { 'fast car': 1, 'slow car': 2 };
cars.sort((carA, carB) => {
if (carA.category !== carB.category) {
return orderCategory[carA.category] - orderCategory[carB.category];
} else {
return carA.id - carB.id;
}
});
console.log(cars);
另外两个建议:
- 您可以在您的案例中使用
const
而不是let
- 您不必为
id
和category
使用引号
希望我的解释能帮到你!快乐编码
编辑:格式化代码。
编辑 2: 我刚刚看到您希望首先列出快车。在我以前的实现中,这是因为字母顺序 (F < S) 而起作用。但是,如果字母顺序不是您希望首先列出它们的原因,则您必须定义类别。您现在可以将“fast car”重命名为“sports car”(无处不在),相应的汽车将首先列出,而根据字母排序,它们将位于每辆“slow car”下方。
我刚刚更新了上面的代码。这是基于字母顺序的旧实现:
类别的字母排序/同一类别时使用 ID:
cars.sort((carA, carB) => {
if (carA.category < carB.category) {
return -1;
} else if (carA.category > carB.category) {
return 1;
}
// same as: else if (carA.category === carB.category)
else {
return carA.id - carB.id;
}
});
编辑 3: 在我的解释中调整了随机排序示例。 Math.random() 返回一个介于 0 和 1 之间的数字。因此,我减去 0.5 以随机返回一个负数。
关于arrays - 将自定义排序应用于 typescript 中的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58930729/