3

I'm trying to achieve nested sorting by some conditions. For example, I have an array of objects:

Array of objects that I have:

    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",
      },
    ];

Array of objects that I'm trying to achieve:

  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',
    },
];

From this array of objects, I'm mapping the object and creating additional key/value 'percentage' to calculate the percentage between total and completed and sort them by the percentage done. Once the sorting by percentage is done I have additional conditions. If the percentage is 100% done sort the 100% done tasks by the 'created' date field. If the percentage is between 1 - 99 order by percentage done and if for example the percentage done between two fields is the same order them by date. Additionally, if the percentage done is 0 then order by asc date.

I have tried this function but cant order the percentage between 1 and 99. Any help with this?

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)

1 Answer 1

1

You could apply some custom sorting.

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; }

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.