Порядок массивов объектов по двум значениям в JS - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующий массив объектов

var parameter = "B001";
var my_array = [
                 {
                  "Shippment_out" : "2020-05-10",
                  "Batch" : "B001",
                  "Truck_No" : "ZB001"
                 },
                 {
                  "Shippment_out" : "2020-05-10",
                  "Batch" : "B002",
                  "Truck_No" : "ZB001"
                 },
                 {
                  "Shippment_out" : "2020-05-11",
                  "Batch" : "B001",
                  "Truck_No" : "ZB002"
                 },
                 {
                  "Shippment_out" : "2020-05-11",
                  "Batch" : "B002",
                  "Truck_No" : "ZB002"
                 },
               ]

Я планирую отсортировать это по параметру, если я передаю номер партии как B001, то массив должен быть отсортирован сначала по B001, а затем по B002 с более ранней датой первым. в этом случае "2020-05-10".

аналогично, если я передам "B002", то "B002", затем "B001". снова более ранняя дата.

Я пытался my_array.sort(function (a, b) {}), но не смог реализовать логи c.

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

В методе sort проверьте значения a.Batch и b.Batch.
если оба значения совпадают с требуемой партией, сортируйте ее в зависимости от отгрузки.
если одно из значений совпадает с партией, вернуть соответственно.

var my_array = [
  {
    Shippment_out: "2020-05-10",
    Batch: "B001",
    Truck_No: "ZB001"
  },
  {
    Shippment_out: "2020-05-10",
    Batch: "B002",
    Truck_No: "ZB001"
  },
  {
    Shippment_out: "2020-05-11",
    Batch: "B001",
    Truck_No: "ZB002"
  },
  {
    Shippment_out: "2020-05-11",
    Batch: "B002",
    Truck_No: "ZB002"
  }
];

const sortArray = (arr, batch) => {
  return arr.sort((a, b) => {
    if (a.Batch === batch && b.Batch === batch) {
      return new Date(a.Shippment_out) - new Date(b.Shippment_out);
    } else if (a.Batch === batch) {
      return -1;
    } else if (b.Batch === batch) {
      return 1;
    } else {
      return 0;
    }
  });
};

console.log('B001', sortArray(my_array, "B001"));
console.log('B002', sortArray(my_array, "B002"));
0 голосов
/ 30 апреля 2020

Вам необходимо объединить важные поля, чтобы отсортировать их. Просто объедините строку пакета со строкой даты, например B00120200511, перед сравнениями внутри вашей функции сортировки.

Редактировать: Чтобы решить проблему пакетной обработки приоритетов, объедините их со строкой '0'.

Код с ваш массив и функция для его сортировки с дополнительным приоритетом пакета

var my_array = [
  {
    "Shippment_out": "2020-05-10",
    "Batch": "B001",
    "Truck_No": "ZB001"
  },
  {
    "Shippment_out": "2020-05-10",
    "Batch": "B002",
    "Truck_No": "ZB001"
  },
  {
    "Shippment_out": "2020-05-11",
    "Batch": "B001",
    "Truck_No": "ZB002"
  },
  {
    "Shippment_out": "2020-05-11",
    "Batch": "B002",
    "Truck_No": "ZB002"
  },
];

/**
 * function to sort any array with .Batch and .Shippment_out fields and optionally prioritization of a Batch option
 * @param {Array} arr An array with fields arr.Batch and arr.Shippment_out
 * @param {String} priority Optional field used if you want to prioritize a Batch in the sort
 */
const sortMyArray = (arr, priority = '') => arr.sort((a, b) => {
  // First: concat strings batch with shippment date
  const a_id = (a.Batch === priority ? '0' : a.Batch) + a.Shippment_out;
  const b_id = (b.Batch === priority ? '0' : b.Batch) + b.Shippment_out;

  // Second: compares the new Id with important data to sort
  return a_id >= b_id ? 1 : -1;
});

// to use, just call sortMyArray. You can call with batch priorization
const result1 = sortMyArray(my_array, 'B002');
console.log(result1);
// or without batch priorization
const result2 = sortMyArray(my_array);
console.log(result2);
0 голосов
/ 30 апреля 2020

Вы можете создать свою функцию сортировки следующим образом:

items.sort(function(a, b) {
     return a.Batch - b.Batch  ||  a.Shippment_out - b.Shippment_out;
});

Вот логика c: если выражение a.Batch - b.Batch имеет значение 0 (поэтому эти свойства равны), оно продолжит оценку || выражение - и вернуть результат a.Shippment_out - b.Shippment_out.

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