gpt4 book ai didi

arrays - 将自定义排序应用于 typescript 中的对象数组

转载 作者:行者123 更新时间:2023-12-05 02:10:16 25 4
gpt4 key购买 nike

我有一个对象数组,我想在我的 Angular 项目中应用自定义排序。

我想要实现的一个简单示例是每个对象都具有属性 idcategory

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
  • 您不必为 idcategory 使用引号

希望我的解释能帮到你!快乐编码


编辑:格式化代码。


编辑 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com