Существует обходное решение путем захвата кликов на document.body
, а затем проверки целевого объекта.
document.body.addEventListener( 'click', function ( event ) {
if( event.srcElement.id == 'btnSubmit' ) {
someFunc();
};
} );
Разверните свою функцию сортировки, чтобы выглядеть так:
function sortF(ob1,ob2) {
if (ob1.strength > ob2.strength) {
return 1;
} else if (ob1.strength < ob2.strength) {
return -1;
}
// Else go to the 2nd item
if (ob1.name < ob2.name) {
return -1;
} else if (ob1.name > ob2.name) {
return 1
} else { // nothing to split them
return 0;
}
}
Сравнение <
и >
по строкам - это алфавитное сравнение.
Эта небольшая функция часто бывает удобной при сортировке по нескольким клавишам:
cmp = function(a, b) {
if (a > b) return +1;
if (a < b) return -1;
return 0;
}
Применить это следующим образом:
array.sort(function(a, b) {
return cmp(a.strength,b.strength) || cmp(a.name,b.name)
})
Javascript действительно отсутствует оператор космического корабля Ruby , что делает такие сравнения чрезвычайно элегантными.
cmp(a, b) || cmp(c, d) || cmp(e, f)
и т. Д. И т. Д. И т. Д.
– georg
14 August 2018 в 12:23
Найдите функцию «sortFn» ниже. Эта функция сортируется по неограниченному числу параметров (например, в c #: SortBy (...). ThenBy (...). ThenByDesc (...)).
function sortFn() {
var sortByProps = Array.prototype.slice.call(arguments),
cmpFn = function(left, right, sortOrder) {
var sortMultiplier = sortOrder === "asc" ? 1 : -1;
if (left > right) {
return +1 * sortMultiplier;
}
if (left < right) {
return -1 * sortMultiplier;
}
return 0;
};
return function(sortLeft, sortRight) {
// get value from object by complex key
var getValueByStr = function(obj, path) {
var i, len;
//prepare keys
path = path.replace('[', '.');
path = path.replace(']', '');
path = path.split('.');
len = path.length;
for (i = 0; i < len; i++) {
if (!obj || typeof obj !== 'object') {
return obj;
}
obj = obj[path[i]];
}
return obj;
};
return sortByProps.map(function(property) {
return cmpFn(getValueByStr(sortLeft, property.prop), getValueByStr(sortRight, property.prop), property.sortOrder);
}).reduceRight(function(left, right) {
return right || left;
});
};
}
var arr = [{
name: 'marry',
LocalizedData: {
'en-US': {
Value: 10000
}
}
}, {
name: 'larry',
LocalizedData: {
'en-US': {
Value: 2
}
}
}, {
name: 'marry',
LocalizedData: {
'en-US': {
Value: 100
}
}
}, {
name: 'larry',
LocalizedData: {
'en-US': {
Value: 1
}
}
}];
document.getElementsByTagName('pre')[0].innerText = JSON.stringify(arr)
arr.sort(sortFn({
prop: "name",
sortOrder: "asc"
}, {
prop: "LocalizedData[en-US].Value",
sortOrder: "desc"
}));
document.getElementsByTagName('pre')[1].innerText = JSON.stringify(arr)
pre {
font-family: "Courier New" Courier monospace;
white-space: pre-wrap;
}
Before:
<pre></pre>
Result:
<pre></pre>
С ES6 вы можете сделать
array.sort(function(a, b) {
return SortFn(a.strength,b.strength) || SortFn(a.name,b.name)
})
private sortFn(a, b): number {
return a === b ? 0 : a < b ? -1 : 1;
}
Вы можете связать порядок сортировки с логическим ИЛИ.
objects.sort(function (a, b) {
return a.strength - b.strength || a.name.localeCompare(b.name);
});
return ((a.strength || Infinity) - (b.strength || Infinity)) || a.name.localeCompare(b.name);
. но это зависит от возможного значения strength
.
– Nina Scholz
7 October 2016 в 06:01
return a.z - b.z || a.x - b.x || a.y - b.y
– bresleveloper
1 November 2017 в 19:29
function sortF(ob1,ob2) {
if (ob1.strength > ob2.strength) {return 1}
else if (ob1.strength < ob2.strength) {return -1}
else if (ob1.name > ob2.name) {return 1}
return -1;
};
EDIT: Сортировка по силе, тогда, если сила равна, сортируйте по имени. Случай, когда сила и имя равны в обоих объектах, не нужно учитывать отдельно, так как окончательный возврат -1 указывает на отношения менее или равные. Результат сортировки будет правильным. Это может заставить его работать быстрее или медленнее, я не знаю. Если вы хотите быть явным, просто замените
return -1;
на
else if (ob1.name < ob2.name) {return -1}
return 0;
Когда я искал ответ на этот вопрос, ответы, которые я нашел на StackOverflow, на самом деле не были тем, на что я надеялся. Поэтому я создал простую, многоразовую функцию, которая делает именно это. Он позволяет использовать стандартный массив Array.sort, но с использованием метода firstBy (). ThenBy (). ThenBy (). https://github.com/Teun/thenBy.js
PS. Это второй раз, когда я публикую это. Первый раз был снят модератором: «Пожалуйста, не делайте рекламные сообщения для своей собственной работы». Я не уверен, какие правила здесь, но я пытался ответить на этот вопрос. Мне очень жаль, что это моя собственная работа. Не стесняйтесь удалять снова, но, пожалуйста, укажите мне правило.