Упорядочить массив сортировки по углам 7 с несколькими состояниями и числом - PullRequest
0 голосов
/ 02 апреля 2019

Так что мне нужно отсортировать этот массив в угловых 7, я получаю это от API:

"Products": [
        {
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": 25,
            "toBeScanned": true
        },{
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": 20,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_2",
            "Description": "Description_2",
            "NationalCode": "N.C. 0382",
            "PendingQuantity": -1,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 0,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 30,
            "toBeScanned": false
        }
    ]

Итак, мой код:

// tslint:disable-next-line:max-line-length
        this.data.Products.sort((b, a) => { if (a.PendingQuantity < 0) { return 1; } if (a.PendingQuantity < 0) {return -1; } if (b.PendingQuantity < 0 ) { return 1; } return b.PendingQuantity - a.PendingQuantity });

Но мне нужно отсортировать по PendingQuantity и toBeScanned, но до этого

  1. мне нужно отсортировать по отрицательному PendingQuantity (отрицательное toBeScanned является истинным или ложным.
  2. Мне нужно отсортировать по состоянию toBeScanned, до истины и после ложь, все это увеличилось PendingQuantity.
  3. каждые PendingQuantity = 0 должны быть показаны в конце массива список.

Надеюсь, мне ясно.

Так что результат я бы:

"Products": [
        {
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": -1,
            "toBeScanned": false
        },{
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": 25,
            "toBeScanned": true
        },
        {
            "ProductCode": "Name_2",
            "Description": "Description_2",
            "NationalCode": "N.C. 0382",
            "PendingQuantity": 20,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 30,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 0,
            "toBeScanned": false
        }
    ]

1 Ответ

1 голос
/ 02 апреля 2019

Для сортировки массива необходимо сравнить два элемента.В вашем случае вы хотите заказать, учитывая один элемент.

Что вы можете сделать, это уменьшить массив, чтобы разделить его на 4 массива, учитывая этот приоритет:

1 - сначала должны быть отрицательные значения

2 - toBeScanned должно быть истинным

3 - Ожидание в нуле должно быть последним

4 - остальные должны быть отсортированы

После сокращения вы можете просто объединить эти массивы, чтобы получить ожидаемый результат.

let products = [
        {
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": 25,
            "toBeScanned": true
        },{
            "ProductCode": "MC30180",
            "Description": "Description_1",
            "NationalCode": "N.C. 0965",
            "PendingQuantity": 20,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_2",
            "Description": "Description_2",
            "NationalCode": "N.C. 0382",
            "PendingQuantity": -1,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 0,
            "toBeScanned": false
        },
        {
            "ProductCode": "Name_3",
            "Description": "Description_3",
            "NationalCode": "N.C. 8913",
            "PendingQuantity": 30,
            "toBeScanned": false
        }
    ];
    
reduced = products.reduce((p, n) => {
  if (n.PendingQuantity < 0) p[0].push(n);
  else if (n.toBeScanned) p[1].push(n);
  else if (!n.PendingQuantity) p[3].push(n);
  else p[2] = [n, ...p[2]].sort((a, b) => a.PendingQuantity - b.PendingQuantity);
  return p;
}, [[], [], [], []]);

sorted = Array.prototype.concat.apply([], reduced);

console.log(sorted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...