Сортировка массива объектов с использованием хорошо известной функции dynamicSort, но получение этой ошибки: «Метод сравнения нарушает его общий контракт» - PullRequest
0 голосов
/ 15 февраля 2020

Я генерирую массив событий календаря, а затем (используя код, полученный от пользователя 'Cooper'), дедуплицирую список, чтобы создать новый массив: dedList

// This code creates a deduplicated array (dedList) from my array 'events' (parts of this code are from Cooper on StackOverflow... and I don't really understand it all)
var dedList=[];
var obj={eA:[]};
for(var i=0;i<events.length;i++) {
  var key=events[i].getTitle() + events[i].getDescription();
  if(!obj.hasOwnProperty(key)) {
    obj[key]={
      title: events[i].getTitle(),
      description: events[i].getDescription(),
      guest_list: events[i].getGuestList(),
      guests: events[i].getGuestList().length,
      start: events[i].getStartTime(),
      end: events[i].getEndTime(),
      recurs: events[i].isRecurringEvent(),
      duration: "",
      creator: events[i].getCreators(),
      color: events[i].getColor() ,
      copies: 0,
      category: "",
    };
    obj.eA.push(key);
  }else{
    obj[key].copies+=1; //count the copies
  }  
}
for(var i=0;i<obj.eA.length;i++) {
  dedList.push(obj[obj.eA[i]]);
}

Это работает отлично, но я использую некоторый хорошо разделяемый код для сортировки dedList по «категории», и он генерирует ошибку, которую я никогда раньше не видел: «Метод сравнения нарушает его общий контракт». Вот строка, вызывающая ошибку, за которой следует используемая мной функция:

dedList.sort(dynamicSort("category")); // this line generates the error

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

Есть предложения? Я довольно новичок в сценариях Google, поэтому не до конца понимаю, как работает функция dynamicSort, и мне сложно отлаживать ошибки. Спасибо!


MCVE:

function sortTest() {
  var arr = [];
  for (i = 0; i < 50; ++i) {
    arr.push({ a: '' }, {}, { a: {} });
  }
  Logger.log(arr.sort(dynamicSort('a')));
}
function dynamicSort(property) {
    var sortOrder = 1;
    return function (a,b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}
  • Двигатель: Rhino (Старый)
  • Ошибка:

Метод сравнения нарушает его генеральный контракт

Ответы [ 2 ]

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

Спасибо за помощь. Код, который я разместил, работает нормально; проблема заключалась в том, что у меня была другая функция, которая меняла некоторые значения категорий на «неопределенные». Я исправил это, и моя проблема исчезла, и мой массив теперь отлично сортируется.

Я собирался удалить это сообщение, но MCVE, добавленный @TheMaster, все еще может быть актуальным? Я оставлю это пока.

0 голосов
/ 15 февраля 2020

Вы пробовали dedList.sort(function(a,b){return a.category-b.category});

или наоборот dedList.sort(function(a,b){return b.category-a.category});

также вы должны удалить запятую из этой строки category: "",

Если это не так я бы не стал упрощать жизнь, инициализируя все категории с помощью «AAAAA»;

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