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

标签 arrays angular typescript

我有一个对象数组,我想在我的 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/

相关文章:

PHP:修剪对象中的每个元素,如果为空,则设置为 N/A

javascript - 响应式(Reactive)表单验证不起作用

unit-testing - Angular 2 (Mock Ionic2) -- 没有应用程序的提供者

javascript - Angular 4 : add new td to table with *ngif with modulo in an *ngfor

javascript - 为什么 Angular Bootstrap 模态的 Jasmine 测试失败?

angular - 使用 TypeScript 在 Angular 管道中使用 MapToIterable

C 返回重复字符的数量

arrays - 将数组值插入 $scalar - Perl

ios - 离开该 View 后维护数组中的数据?

javascript - typescript 。引用错误 : require is not defined