Я генерирую массив событий календаря, а затем (используя код, полученный от пользователя '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 (Старый)
- Ошибка:
Метод сравнения нарушает его генеральный контракт