我有一个对象数组,我想在Angular Project中对其应用自定义排序。
我要实现的一个简单示例是,每个对象都具有属性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" }
];
不,我想对数组进行排序。首先,应该显示每辆快速车(如果按ID有多种排序),然后是慢车(如果也有按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)而起作用的。但是,如果不是字母顺序不是您要首先列出它们的原因,则必须定义类别。现在,您可以将“快速车”重命名为“运动车”(到处都是),并且首先会列出各个汽车,而根据字母排序,它们将位于每个“慢速车”的下方。
我刚刚更新了上面的代码。这是基于字母顺序的旧实现:
按类别的字母顺序排序/如果是相同类别,则使用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以随机返回一个负数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句