Сортировка массива, возможно ли?
Здравствуйте!
Имеется одномерный массив, следующего, примерно, вида: arr [0] = "1 + 2 =3" arr [1] = "3* 2 =6" arr [2] = "2+5 =7" arr [3] = "1 +2=3" Там разное количество пробелов между знаками, к тому же (после знака "=" пробелов нет). Нужно сортировать по второму значению, а также - по ответу. Интуитивно я догадываюсь, что такая сортировка возможна. Однако сказывается нехватка опыта. Не могли бы уважаемые Гуру наставить на путь истинный, желательно не слишком усложняя алгоритм? Заранее спасибо за ответ! |
function getTwoValue(exp) {
var matches = /^\d+\s*[\/*%+-]\s*(\d+)/.exec(exp);
return matches ? matches[1] : 0;
}
function sortByTwoValue(a, b) {
a = getTwoValue(a);
b = getTwoValue(b);
return a < b ? -1 : +(a > b);
}
var arr = [];
arr [0] = "1 + 2 =3"
arr [1] = "3* 2 =6"
arr [2] = "2+5 =7"
arr [3] = "1 +2=3"
arr.sort(sortByTwoValue);
console.log(arr);
|
Zmicer, у метода sort() можно использовать т.н. сорт-функцию. ;)
В ней ты и определишь нужный тебе порядок сортировки http://javascript.ru/array/sort |
Спасибо, Ruslan_xDD!
А не могли бы Вы кратко прокомментировать этот код, а то у меня какой-то когнитивный диссонанс наступил |
Цитата:
<script>
function getTwoValue(exp) {
return exp.match(/(\-?\d+)/g);
}
function sortByTwoValue(a, b) {
a = getTwoValue(a);
b = getTwoValue(b);
return +a[1] - +b[1] || +a[2] - +b[2];
}
var arr = [];
arr [0] = "1 + 2 =3"
arr [1] = "3* 2 =6"
arr [2] = "2+5 =7"
arr [3] = "1 +2=3"
arr.sort(sortByTwoValue);
document.write(JSON.stringify(arr))
</script>
|
Цитата:
|
Цитата:
|
Zmicer,
возвращает условно -1(отрицательное число) или 1(положительное число) или 0 -- смотреть пост №3 или свой-порядок-сортировки сначала сравнивает по второму значению +a[1] - +b[1] если результат ноль переходит к сравнению по ответу +a[2] - +b[2] -- волшебство возможно только для чисел для строк придётся писать чуть больше |
Спасибо, рони. Теперь более-менее понятно. Попробую сделать сам что-нибудь в этом роде. А не могли бы Вы пояснить подробнее это регулярное выражение: return exp.match(/(\-?\d+)/g)
|
Zmicer,
выделить из строки всё похожее на число или отрицательное число |
Цитата:
|
Цитата:
|
Цитата:
![]() |
Цитата:
P.S.: Кстати, тестер регулярок… Тем более, регулярки - и в Perl, и в PHP в первую очередь вводились. В JS регулярки, так, опционально-мимоходов внедрились;) Цитата:
|
Цитата:
![]() |
Цитата:
Мне вообще нравятся книжки из серии "Для чайников" и "За 24 часа". Они быстро дают представление о некоем "направлении". Порой бывает достаточно и его. Если не достаточно - в ход идут книги толще и более специфичнее... |
Я думаю, надо с учебника начать - https://learn.javascript.ru/
А то в книжках может быть хрень, антипаттерны, бэд-практисы. А тут все на виду, если что - на форуме скажут ) |
мой вариант просто так)
var arr = [];
arr [0] = "1 + 2 =3";
arr [1] = "3* 2 =6";
arr [2] = "2+5 =7";
arr [3] = "1 +2=3";
function compareBySecond(a,b){
let number = n => Number(n.match(/(\d+)\s*\=\d+$/)[1]);
return number(a) - number(b);
}
function compareByAnswer(a,b){
let number = n => Number(n.match(/(\d+)$/)[1]);
return number(a) - number(b);
}
arr.sort(compareBySecond);
alert(arr);
arr.sort(compareByAnswer);
alert(arr);
|
| Часовой пояс GMT +3, время: 05:23. |