Как отсортировать объекты в массиве по дате без использования метода сортировки? - PullRequest
0 голосов
/ 04 февраля 2020

Для проекта, который я должен сделать для школы, я должен подать заявление, которое может сортировать встречи по дате и времени. У меня есть массив с объектами в них, но я не могу понять, как отсортировать его по дате, когда дата вложена.

Вот функция пузырьковой сортировки, которую я сделал:

function bubbleSort() {
    const loop = listOfAppointments.length;

    for(let i = 0; i < loop; i++) {
        for(let j = 0; j < loop; j++) {
            if(listOfAppointments[j] > listOfAppointments[j+1]) {
                let temp = listOfAppointments[j];
                listOfAppointments[j] = listOfAppointments[j+1];
                listOfAppointments[j+1] = temp;
            }
        }
    }
}

Эта функция отлично работает с числами, но я не могу понять, как отсортировать объект с помощью этой функции. Я знаю, что в javascript есть функция сортировки, но нам не разрешено ее использовать. Массив, который я пытаюсь отсортировать, выглядит следующим образом:

[
  {
    "Appointment": {
      "Id": 2,
      "nameCustomer": "Henk Jan",
      "addresdCustomer": "somethingstreet 34, middleofnowhere",
      "time": "2020-01-07T10:00:00Z",
      "reason": "gibberish"
    }
  },
  {
    "Appointment": {
      "Id": 1,
      "nameCustomer": "Jan Jaap",
      "addresdCustomer": "somethingpavilion 54, middleofnowhere",
      "time": "2020-01-07T12:15:00Z",
      "reason": "gibberish"
    }
  },
  {
    "Appointment": {
      "Id": 3,
      "nameCustomer": "So Lost",
      "addresdCustomer": "somethingthere 234, middleofnowhere",
      "time": "2020-01-07T11:30:00Z",
      "reason": "gibberish"
    }
  },
  ...
]

Спасибо!

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Из того, что я помню из алгоритма сортировки пузырьков.
Должно быть что-то вроде этого.

Время конвертируется в даты для сравнения.

И 2-е l oop подталкивает самое высокое к концу.
Так что при каждом запуске ему нужно на l oop 1 меньше индекса.

bubblesort

function bubbleSortAppointments(arr) {
    for(let i = arr.length - 1; i > 0; i--) {
        for(let j = 0; j < i; j++) {
            let date1 = new Date(arr[j].Appointment.time);
            let date2 = new Date(arr[j+1].Appointment.time);
            if(date1.getTime() > date2.getTime()) {
              let temp = arr[j];
              arr[j] = arr[j+1];
              arr[j+1] = temp;
            }
        }
    }
}


let listOfAppointments = [
{
  "Appointment": {
    "Id": 2,
    "nameCustomer": "Henk Jan",
    "addressCustomer": "somethingstreet 34, middleofnowhere",
    "time": "2020-01-07T10:00:00Z",
    "reason": "gibberish"
  }
},
{
  "Appointment": {
  "Id": 1,
  "nameCustomer": "Jan Jaap",
  "addressCustomer": "somethingpavilion 54, middleofnowhere",
  "time": "2020-01-07T12:15:00Z",
  "reason": "gibberish"
}
  },
  {
"Appointment": {
  "Id": 3,
  "nameCustomer": "So Lost",
  "addressCustomer": "somethingthere 234, middleofnowhere",
  "time": "2020-01-07T11:30:00Z",
  "reason": "gibberish"
}
  }
];

bubbleSortAppointments(listOfAppointments);

console.log(listOfAppointments);
1 голос
/ 04 февраля 2020

Попробуйте

1002 *
0 голосов
/ 04 февраля 2020

Во-первых, вам не нужен внешний l oop (тот, который считает переменную i), потому что он вообще не используется.

Я бы предложил изменить Ваша bubbleSort функция принимает два аргумента: список для сортировки и функцию предиката. Функция предиката должна принимать два аргумента (каждый будет назначением) и возвращать true / false. Используйте результат предиката для сортировки: если предикат возвращает true, выполните сортировку, в противном случае - нет.

Ниже приведена рабочая реализация. Функции earliest и mostRecent являются предикатами.

Примечание. Показанная функция *1015* является чистой , что означает, что вместо изменения данного аргумента списка создается клон из списка и сортирует этот клон. Вы не можете иметь , чтобы сделать это таким образом, если вы не хотите. Тем не менее, я бы посоветовал вам сделать это.

const appointments = [
  {
    "Appointment": {
      "Id": 2,
      "nameCustomer": "Henk Jan",
      "addresdCustomer": "somethingstreet 34, middleofnowhere",
      "time": "2020-01-07T10:00:00Z",
      "reason": "gibberish"
    }
  },
  {
    "Appointment": {
      "Id": 1,
      "nameCustomer": "Jan Jaap",
      "addresdCustomer": "somethingpavilion 54, middleofnowhere",
      "time": "2020-01-07T12:15:00Z",
      "reason": "gibberish"
    }
  },
  {
    "Appointment": {
      "Id": 3,
      "nameCustomer": "So Lost",
      "addresdCustomer": "somethingthere 234, middleofnowhere",
      "time": "2020-01-07T11:30:00Z",
      "reason": "gibberish"
    }
  }
];

// bubbleSort :: Array -> Function -> Array
function bubbleSort(list, predicate) {
    const size = list.length - 1; // <-- or last item will produce errors!
    const clone = list.slice(); // <-- clone of given list, just to be pure

    for(let j = 0; j < size; j++) {
        if(predicate(clone[j], clone[j+1])) { // <-- this line
            let temp = clone[j];
            clone[j] = clone[j+1];
            clone[j+1] = temp;
        }
    }
    
    
    return clone;
}

// earliest :: Appointment -> Appointment -> Boolean
function earliest (a, b) {
  return Date.parse(a.Appointment.time) > Date.parse(b.Appointment.time);
}

// mostRecent :: Appointment -> Appointment -> Boolean
function mostRecent (a, b) {
  return Date.parse(a.Appointment.time) < Date.parse(b.Appointment.time);
}


console.log('Earliest', bubbleSort(appointments, earliest))
console.log('Most recent', bubbleSort(appointments, mostRecent))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...