在 JavaScript 中按多个属性对对象数组进行排序

javascriptweb developmentfront end technologyobject oriented programming更新于 2024/1/9 13:00:17

假设我们有一个像这样的对象数组 −

const arr = [
   { id: 1, score: 1, isCut: false, dnf: false },
   { id: 2, score: 2, isCut: false, dnf: false },
   { id: 3, score: 3, isCut: false, dnf: false },
   { id: 4, score: 4, isCut: false, dnf: false },
   { id: 5, score: 5, isCut: true, dnf: true },
   { id: 6, score: 6, isCut: true, dnf: false },
   { id: 7, score: 7, isCut: true, dnf: false },
   { id: 8, score: 8, isCut: true, dnf: false },
   { id: 9, score: 9, isCut: true, dnf: false },
   { id: 10, score: 0, isCut: false, dnf: false },
   { id: 11, score: -1, isCut: false, dnf: false },
   { id: 12, score: -2, isCut: false, dnf: true },
   { id: 13, score: -3, isCut: false, dnf: false },
   { id: 14, score: -4, isCut: false, dnf: false },
   { id: 15, score: -5, isCut: false, dnf: false },
   { id: 16, score: 10, isCut: true, dnf: false }
];

我们需要根据以下标准对上述数组进行排序 −

如果 dnf 为真,

object 移至底部;所有 dnf 对象都应按分数排序

如果问题为真,

object 移至底部,但高于 dnfs;所有 isCut 对象都应按分数排序

其余应按分数排序,如果分数相等,则按 id 排序

示例

其代码为 −

const arr = [
   { id: 1, score: 1, isCut: false, dnf: false },
   { id: 2, score: 2, isCut: false, dnf: false },
   { id: 3, score: 3, isCut: false, dnf: false },
   { id: 4, score: 4, isCut: false, dnf: false },
   { id: 5, score: 5, isCut: true, dnf: true },
   { id: 6, score: 6, isCut: true, dnf: false },
   { id: 7, score: 7, isCut: true, dnf: false },
   { id: 8, score: 8, isCut: true, dnf: false },
   { id: 9, score: 9, isCut: true, dnf: false },
   { id: 10, score: 0, isCut: false, dnf: false },
   { id: 11, score: -1, isCut: false, dnf: false },
   { id: 12, score: -2, isCut: false, dnf: true },
   { id: 13, score: -3, isCut: false, dnf: false },
   { id: 14, score: -4, isCut: false, dnf: false },
   { id: 15, score: -5, isCut: false, dnf: false },
   { id: 16, score: 10, isCut: true, dnf: false }
];
const sortComplex = (arr = []) => {
   arr.sort(function (a, b) {
      const order = (dnf, isCut) => {
         return [0, 1, 3, 2][dnf * 2 + isCut];
      }
      return order(a.dnf, a.isCut) - order(b.dnf, b.isCut) || b.score - a.score;
   });
};
sortComplex(arr);
console.log(arr);

输出

控制台中的输出将是 −

[
   { id: 4, score: 4, isCut: false, dnf: false },
   { id: 3, score: 3, isCut: false, dnf: false },
   { id: 2, score: 2, isCut: false, dnf: false },
   { id: 1, score: 1, isCut: false, dnf: false },
   { id: 10, score: 0, isCut: false, dnf: false },
   { id: 11, score: -1, isCut: false, dnf: false },
   { id: 13, score: -3, isCut: false, dnf: false },
   { id: 14, score: -4, isCut: false, dnf: false },
   { id: 15, score: -5, isCut: false, dnf: false },
   { id: 16, score: 10, isCut: true, dnf: false },
   { id: 9, score: 9, isCut: true, dnf: false },
   { id: 8, score: 8, isCut: true, dnf: false },
   { id: 7, score: 7, isCut: true, dnf: false },
   { id: 6, score: 6, isCut: true, dnf: false },
   { id: 5, score: 5, isCut: true, dnf: true },
   { id: 12, score: -2, isCut: false, dnf: true }
]

相关文章


有用资源