js将数组中的对象的某一属性值的数组按照其内部的某一字段的值重新排序

文章讲述了如何使用JavaScript处理一个名为mockData的数组,该数组包含对象及其opInfoMap属性,opInfoMap是一个数组,需要按照taskStatus字段进行排序。通过定义一个sort函数并使用map方法遍历数据,实现了按taskStatus顺序排列opInfoMap内的对象。

原始数据,其内部 opInfoMap 数组中的数据是乱序排列的,希望其能按照 taskStatus 顺序排列

const mockData = [
      {
        areaId: "1701618149f89accf2c06549d2022eeb",
        areaName: "1215-活动6",
        opInfoMap: [
          {
            count: 836,
            percent: "82.53%",
            taskStatus: 4,
          },
          {
            count: 177,
            percent: "17.47%",
            taskStatus: 5,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 1,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 2,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 3,
          },
        ],
      },
      {
        areaId: "122687b5aa66018cd1a43fe9c7665071",
        areaName: "1215-活动10",
        opInfoMap: [
          {
            count: 2301,
            percent: "84.44%",
            taskStatus: 4,
          },
          {
            count: 423,
            percent: "15.52%",
            taskStatus: 5,
          },
          {
            count: 1,
            percent: "0.04%",
            taskStatus: 1,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 2,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 3,
          },
        ],
      },
    ];

期望格式:

const expectData = [
      {
        areaId: "1701618149f89accf2c06549d2022eeb",
        areaName: "1215-活动6",
        opInfoMap: [
          {
            count: 0,
            percent: "0%",
            taskStatus: 1,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 2,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 3,
          },
          {
            count: 836,
            percent: "82.53%",
            taskStatus: 4,
          },
          {
            count: 177,
            percent: "17.47%",
            taskStatus: 5,
          },
        ],
      },
      {
        areaId: "122687b5aa66018cd1a43fe9c7665071",
        areaName: "1215-活动10",
        opInfoMap: [
          {
            count: 1,
            percent: "0.04%",
            taskStatus: 1,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 2,
          },
          {
            count: 0,
            percent: "0%",
            taskStatus: 3,
          },
          {
            count: 2301,
            percent: "84.44%",
            taskStatus: 4,
          },
          {
            count: 423,
            percent: "15.52%",
            taskStatus: 5,
          },
        ],
      },
    ];

实现:

const sortopInfoMapData = (data, name) => {
    const sortBy = (field) => {
      //根据传过来的字段进行排序
      return (x, y) => {
        return x[field] - y[field];
      };
    };
    data.map((obj) => {
      obj.opInfoMap.sort(sortBy(name));
      return obj;
    });
    return data;
  };

sortopInfoMapData(mockData, 'taskStatus')

在 JavaScript 中,对对象数组根据某属性值进行排序种常见的操作。可以通过 `Array.prototype.sort()` 方法结合个比较函数实现这功能。以下是具体实现方式: ### 对象数组按属性降序排序 要根据对象数组中某个属性的进行 **降序排序**,可以在调用 `sort()` 方法时提供个自定义的比较函数。该函数接收两个参数(通常命名为 `a` 和 `b`),分别代表数组中的两个元素。 例如,假设有个包含多个对象数组 `people`,每个对象都有个 `age` 属性,希望按照 `age` 从大到小排序: ```javascript const people = [ { name: "Alice", age: 25 }, { name: "Bob", age: 30 }, { name: "Charlie", age: 20 } ]; people.sort((a, b) => b.age - a.age); console.log(people); // 输出: [ { name: 'Bob', age: 30 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 20 } ] ``` 上述代码中,`sort()` 方法接受了个箭头函数 `(a, b) => b.age - a.age` 作为比较函数,它确保数组按照 `age` 属性的从高到低排序[^4]。 ### 更通用的方法:使用函数封装 如果需要多次执行此类排序操作,可以将逻辑封装成个函数。例如,以下函数 `sortByProperty` 接受个属性名和排序方向(升序或降序)作为参数,并返回个适用于 `sort()` 的比较函数: ```javascript function sortByProperty(property, descending = true) { return function (a, b) { const valueA = a[property]; const valueB = b[property]; if (descending) { return valueB - valueA; } else { return valueA - valueB; } }; } // 示例:按 age 降序排序 const sortedPeople = people.sort(sortByProperty("age", true)); console.log(sortedPeople); // 输出: [ { name: 'Bob', age: 30 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 20 } ] ``` 这种方法提高了灵活性,允许动态指定排序字段和顺序[^5]。 ### 处理字符串属性排序排序依据是字符串属性(如姓名)时,JavaScript 的 `localeCompare()` 方法可以用于比较字符串。例如,按 `name` 字母顺序排序: ```javascript people.sort((a, b) => a.name.localeCompare(b.name)); console.log(people); // 输出: [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }, { name: 'Charlie', age: 20 } ] ``` 此方法支持本地化排序规则,适用于多语言环境下的字符串比较[^2]。 ### 总结 - 使用 `sort()` 方法配合比较函数可以轻松实现对象数组按属性排序。 - 比较函数决定了排序顺序,降序可通过 `b[property] - a[property]` 实现。 - 可以通过封装函数提高代码复用性和可维护性。 - 对于字符串属性,推荐使用 `localeCompare()` 方法进行比较。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值