【问题标题】:Nest conditional sorting JavaScript array of objects嵌套条件排序 JavaScript 对象数组
【发布时间】:2021-04-15 10:49:35
【问题描述】:

我正在尝试通过某些条件实现嵌套排序。例如,我有一个对象数组:

我拥有的对象数组:

    var objArray = [
      {
        total: 2,
        completed: 1,
        created: "2021-03-19T13:09:57.9191082",
      },
      {
        total: 2,
        completed: 0,
        created: "2021-03-19T15:36:32.5761928",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-03-19T15:40:47.1690151",
      },
      {
        total: 3,
        completed: 1,
        created: "2021-03-22T09:33:03.1541255",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-03-23T08:42:45.9854381",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-03-23T09:37:17.8576954",
      },
      {
        total: 22,
        completed: 2,
        created: "2021-03-23T09:40:16.1180247",
      },
      {
        total: 22,
        completed: 21,
        created: "2021-03-23T10:07:13.6602386",
      },
      {
        total: 2,
        completed: 2,
        created: "2021-04-01T08:41:17.2340404",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-04-01T09:33:20.9257699",
      },
      {
        total: 2,
        completed: 2,
        created: "2021-04-01T09:40:13.4354591",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-04-07T07:43:03.8319172",
      },
      {
        total: 4,
        completed: 0,
        created: "2021-04-07T07:50:36.8278655",
      },
      {
        total: 2,
        completed: 2,
        created: "2021-04-07T08:31:05.2998603",
      },
      {
        total: 2,
        completed: 1,
        created: "2021-04-07T08:31:53.3266938",
      },
      {
        total: 3,
        completed: 0,
        created: "2021-04-15T08:18:33.1249212",
      },
      {
        total: 3,
        completed: 1,
        created: "2021-04-15T08:21:25.5196674",
      },
    ];

我想要实现的对象数组:

  var objArray = [
    {
        percentage: '0',
        total: 2,
        completed: 0,
        created: '2021-03-19T15:36:32.5761928',
    },
    {
        percentage: '0',
        total: 4,
        completed: 0,
        created: '2021-04-07T07:50:36.8278655',
    },
    {
        percentage: '0',
        total: 3,
        completed: 0,
        created: '2021-04-15T08:18:33.1249212',
    },
    {
        percentage: '95',
        total: 22,
        completed: 21,
        created: '2021-03-23T10:07:13.6602386',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-03-19T13:09:57.9191082',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-03-19T15:40:47.1690151',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-03-23T08:42:45.9854381',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-03-23T09:37:17.8576954',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-04-01T09:33:20.9257699',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-04-07T07:43:03.8319172',
    },
    {
        percentage: '50',
        total: 2,
        completed: 1,
        created: '2021-04-07T08:31:53.3266938',
    },
    {
        percentage: '33',
        total: 3,
        completed: 1,
        created: '2021-03-22T09:33:03.1541255',
    },
    {
        percentage: '33',
        total: 3,
        completed: 1,
        created: '2021-04-15T08:21:25.5196674',
    },
    {
        percentage: '9',
        total: 22,
        completed: 2,
        created: '2021-03-23T09:40:16.1180247',
    },
    {
        percentage: '100',
        total: 2,
        completed: 2,
        created: '2021-04-07T08:31:05.2998603',
    },
    {
        percentage: '100',
        total: 2,
        completed: 2,
        created: '2021-04-01T09:40:13.4354591',
    },
    {
        percentage: '100',
        total: 2,
        completed: 2,
        created: '2021-04-01T08:41:17.2340404',
    },
];

从这个对象数组中,我映射对象并创建额外的键/值“百分比”来计算总数和完成之间的百分比,并按完成的百分比对它们进行排序。完成百分比排序后,我还有其他条件。如果百分比为 100% 完成,则按“创建”日期字段对 100% 完成的任务进行排序。如果百分比在 1 - 99 之间,则按完成百分比排序,例如,如果两个字段之间的完成百​​分比相同,则按日期排序。此外,如果完成的百分比为 0,则按 asc date 排序。

我已经尝试过这个功能,但无法对 1 到 99 之间的百分比进行排序。对此有什么帮助吗?

var objArray = [
  {
    total: 2,
    completed: 1,
    created: "2021-03-19T13:09:57.9191082",
  },
  {
    total: 2,
    completed: 0,
    created: "2021-03-19T15:36:32.5761928",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-03-19T15:40:47.1690151",
  },
  {
    total: 3,
    completed: 1,
    created: "2021-03-22T09:33:03.1541255",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-03-23T08:42:45.9854381",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-03-23T09:37:17.8576954",
  },
  {
    total: 22,
    completed: 2,
    created: "2021-03-23T09:40:16.1180247",
  },
  {
    total: 22,
    completed: 21,
    created: "2021-03-23T10:07:13.6602386",
  },
  {
    total: 2,
    completed: 2,
    created: "2021-04-01T08:41:17.2340404",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-04-01T09:33:20.9257699",
  },
  {
    total: 2,
    completed: 2,
    created: "2021-04-01T09:40:13.4354591",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-04-07T07:43:03.8319172",
  },
  {
    total: 4,
    completed: 0,
    created: "2021-04-07T07:50:36.8278655",
  },
  {
    total: 2,
    completed: 2,
    created: "2021-04-07T08:31:05.2998603",
  },
  {
    total: 2,
    completed: 1,
    created: "2021-04-07T08:31:53.3266938",
  },
  {
    total: 3,
    completed: 0,
    created: "2021-04-15T08:18:33.1249212",
  },
  {
    total: 3,
    completed: 1,
    created: "2021-04-15T08:21:25.5196674",
  },
];

var sorted = objArray
  .map((p) => ({ percentage: ((p.completed / p.total) * 100).toFixed(), ...p }))
  .sort((a, b) => {
    if (
      a.percentage == b.percentage &&
      a.percentage == "100" &&
      b.percentage == "100"
    ) {
      return b.created.localeCompare(a.created);
    } else if (a.percentage == b.percentage) {
      return a.created.localeCompare(b.created);
    } else {
      return Number(a.percentage) - Number(b.percentage);
    }
  });

console.log(sorted)

【问题讨论】:

    标签: javascript sorting


    【解决方案1】:

    您可以应用一些自定义排序。

    const
        objArray = [{ total: 2, completed: 1, created: '2021-03-19T13:09:57.9191082', }, { total: 2, completed: 0, created: '2021-03-19T15:36:32.5761928' }, { total: 2, completed: 1, created: '2021-03-19T15:40:47.1690151' }, { total: 3, completed: 1, created: '2021-03-22T09:33:03.1541255' }, { total: 2, completed: 1, created: '2021-03-23T08:42:45.9854381' }, { total: 2, completed: 1, created: '2021-03-23T09:37:17.8576954' }, { total: 22, completed: 2, created: '2021-03-23T09:40:16.1180247' }, { total: 22, completed: 21, created: '2021-03-23T10:07:13.6602386' }, { total: 2, completed: 2, created: '2021-04-01T08:41:17.2340404' }, { total: 2, completed: 1, created: '2021-04-01T09:33:20.9257699' }, { total: 2, completed: 2, created: '2021-04-01T09:40:13.4354591' }, { total: 2, completed: 1, created: '2021-04-07T07:43:03.8319172' }, { total: 4, completed: 0, created: '2021-04-07T07:50:36.8278655' }, { total: 2, completed: 2, created: '2021-04-07T08:31:05.2998603' }, { total: 2,  completed: 1, created: '2021-04-07T08:31:53.3266938' }, { total: 3, completed: 0, created: '2021-04-15T08:18:33.1249212' }, { total: 3, completed: 1, created: '2021-04-15T08:21:25.5196674' }],
        sorted = objArray
            .map(p => ({ percentage: (p.completed * 100 / p.total).toFixed(), ...p }))
            .sort((a, b) => {
                const
                    order = { 0: -1, 100: 1 },
                    direction = ((a.percentage !== '100') || -1);
    
                return (order[a.percentage] || 0) - (order[b.percentage] || 0)
                    || b.percentage - a.percentage
                    || direction * a.created.localeCompare(b.created);
            });
    
    console.log(sorted);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2016-07-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多