当前位置: 首页 > 知识库问答 >
问题:

JavaScript排序基于属性数组对象数组

淳于开畅
2023-03-14

例如,我有以下数据集:

const order = [
  { key: "job", direction: "ascending" },
  { key: "age", direction: "descending" },
];

const records = [
  { name: "christian", age: 40, job: "developer" },
  { name: "andrew", age: 48, job: "developer" },
  { name: "elisabeth", age: 31, job: "floor manager" },
  { name: "oscar", age: 61, job: "floor manager" },
  { name: "gisela", age: 51, job: "area manager" },
  { name: "buffy", age: 27, job: "trainee" },
  { name: "carl", age: 23, job: "trainee" },
];

我需要根据order数组中的条件对records数组进行排序。我最终得出了这样的解决方案:

const sorted = records.sort(
  (recordA, recordB) =>
    recordA.job.localeCompare(recordB.job) || recordA.age - recordB.age
);

但我无法理解如何使用order数组而不是硬编码的jobage属性。order数组可以有许多属性。

共有2个答案

蒋泰
2023-03-14

只需循环访问订单数据并进行比较:

null

let order = [{ key: "job", direction: "ascending" }, { key: "age", direction: "descending" }];
let records = [{ name: "christian", age: 40, job: "developer" }, { name: "andrew", age: 48, job: "developer" }, { name: "elisabeth", age: 31, job: "floor manager" }, { name: "oscar", age: 61, job: "floor manager" }, { name: "gisela", age: 51, job: "area manager" }, { name: "buffy", age: 27, job: "trainee" }, { name: "carl", age: 23, job: "trainee" }];

records.sort(function (a, b) {
    for (let {key, direction} of order) {
        if (a[key] !== b[key]) return (direction[0] === "a") === (a[key] < b[key]) ? -1 : 1;
    }
    return 0;
});

console.log(records);
css lang-css prettyprint-override">.as-console-wrapper { max-height: 100% !important; top: 0; }
马野
2023-03-14

您可以对通缉令执行一个闭包,并检查值是否有限,然后返回delta或将值作为字符串处理。

内部排序函数只要返回值为假值就迭代,并将该值作为返回值进行排序。

null

const
    sortBy = order => (a, b) => {
        let r;
        order.some(({ key, direction }) => r = (isFinite(a[key]) && isFinite(b[key])
            ? a[key] - b[key]
            : a[key].toString().localeCompare(b[key])        
        ) * (direction === 'ascending' || -1))
        return r;
    },
    records = [{ name: "christian", age: 40, job: "developer" }, { name: "andrew", age: 48, job: "developer" }, { name: "elisabeth", age: 31, job: "floor manager" }, { name: "oscar", age: 61, job: "floor manager" }, { name: "gisela", age: 51, job: "area manager" }, { name: "buffy", age: 27, job: "trainee" }, { name: "carl", age: 23, job: "trainee" }],
    order = [{ key: "job", direction: "ascending" }, { key: "age", direction: "descending" }];

console.log(records.sort(sortBy(order)));
.as-console-wrapper { max-height: 100% !important; top: 0; }
 类似资料:
  • 本文向大家介绍JS sort方法基于数组对象属性值排序,包括了JS sort方法基于数组对象属性值排序的使用技巧和注意事项,需要的朋友参考一下 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. 如何根据参数不同,来确定是升序排列,还是降序排序呢? 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我已经使用AJAX获得了以下对象并将它们存储在数组中: 如何仅使用JavaScript 创建一个函数以按属性 升序 或 降序 对对象进行排序? 问题答案: 按价格升序对房屋进行排序: 或在ES6版本之后:

  • 我有一个具有以下结构的对象数组: 我希望输出为: 因为这两个都检查了。 我已尝试根据选中值筛选出: 我正在获取已选中属性值设置为。 我们将不胜感激。

  • 问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:

  • 问题内容: 在Swift 2.0中,您将如何按属性对自定义对象数组进行排序?我知道在Swift 1.2中,这是使用sorted()和sort()完成的。但是,这些方法在Xcode 7 beta 4中不再起作用。谢谢! 例如: 问题答案: 在Swift 2中: 您可以使用方法,使用来比较两个日期: 或者,如果您想对原始数组进行排序,则可以: 在Swift 3中 返回数组的排序形式,请使用,而不是 排

  • 我有一个JavaScript对象数组: 如何在JavaScript中按照的值对它们进行排序? 我知道,但它似乎只适用于字符串和数字。是否需要向对象添加方法?