Компаратор в очереди приоритетов: Javascript - PullRequest
0 голосов
/ 16 января 2019

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

class PriorityQueue {
  constructor({ comparator = (a, b) => a - b, initialValues = [] } = {}) {
    this.comparator = comparator;
    this.data = initialValues;
    this.heapify();
  }

Я не понимаю, что означает эта строка,

{ comparator = (a, b) => a - b, initialValues = [] } = {}

Полный код здесь, если вам это нужно, https://github.com/jeantimex/javascript-problems-and-solutions/blob/master/src/common/priority-queue.js

Но может кто-нибудь помочь мне понять эту строку кода. Спасибо в ожидании.

1 Ответ

0 голосов
/ 16 января 2019

Конструктор ожидает нулевой или один аргумент, который, если предоставлен, должен быть объектом. Если аргумент не предоставлен, по умолчанию используется пустой объект. Затем он проверяет (возможно, пустой) объект на наличие свойств comparator и initialValues. Если эти свойства существуют в объекте, они извлекаются в эти имена переменных (comparator и initialValues) - в противном случае этим именам переменных присваиваются значения по умолчанию, (a, b) => a - b для comparator и [] для initialValues.

Например

new PriorityQueue()

приводит к PriorityQueue с .comparator из (a, b) => a - b и initialValues из [], тогда как

new PriorityQueue({ comparator: (a, b) => a.localeCompare(b) })

приводит к PriorityQueue с .comparator из (a, b) => a.localeCompare(b) и initialValues из [].

Если в переданном аргументе содержатся свойства, отличные от comparator или initialValues, они игнорируются.

Написано многословно, без параметров по умолчанию:

class PriorityQueue {
  constructor(obj) {
    if (obj === undefined) {
      obj = {};
    }
    if (obj.comparator === undefined) {
      obj.comparator = (a, b) => a - b;
    }
    if (!obj.initialValues === undefined) {
      obj.initialValues = [];
    }

    // main constructor body starts here
    this.comparator = obj.comparator;
    this.data = obj.initialValues;
    this.heapify();
  }
...