Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сортировка массива, возможно ли? (https://javascript.ru/forum/misc/67610-sortirovka-massiva-vozmozhno-li.html)

Zmicer 27.02.2017 11:35

Сортировка массива, возможно ли?
 
Здравствуйте!
Имеется одномерный массив, следующего, примерно, вида:

arr [0] = "1 + 2 =3"
arr [1] = "3* 2 =6"
arr [2] = "2+5 =7"
arr [3] = "1 +2=3"

Там разное количество пробелов между знаками, к тому же (после знака "=" пробелов нет). Нужно сортировать по второму значению, а также - по ответу. Интуитивно я догадываюсь, что такая сортировка возможна. Однако сказывается нехватка опыта. Не могли бы уважаемые Гуру наставить на путь истинный, желательно не слишком усложняя алгоритм? Заранее спасибо за ответ!

ruslan_mart 27.02.2017 11:53

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);

ksa 27.02.2017 11:54

Zmicer, у метода sort() можно использовать т.н. сорт-функцию. ;)
В ней ты и определишь нужный тебе порядок сортировки
http://javascript.ru/array/sort

Zmicer 27.02.2017 11:56

Спасибо, Ruslan_xDD!
А не могли бы Вы кратко прокомментировать этот код, а то у меня какой-то когнитивный диссонанс наступил

рони 27.02.2017 12:20

Цитата:

Сообщение от Zmicer
сортировать по второму значению, а также - по ответу.

<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 27.02.2017 12:34

Цитата:

Сообщение от рони
 return +a[1] - +b[1] || +a[2] - +b[2]

Спасибо! А что делает эта волшебная строка?

ruslan_mart 27.02.2017 12:43

Цитата:

Сообщение от Zmicer
А не могли бы Вы кратко прокомментировать этот код,

Нет :)

рони 27.02.2017 12:49

Zmicer,
возвращает условно -1(отрицательное число) или 1(положительное число) или 0 -- смотреть пост №3 или свой-порядок-сортировки
сначала сравнивает по второму значению +a[1] - +b[1] если результат ноль переходит к сравнению по ответу +a[2] - +b[2] -- волшебство возможно только для чисел для строк придётся писать чуть больше

Zmicer 27.02.2017 13:05

Спасибо, рони. Теперь более-менее понятно. Попробую сделать сам что-нибудь в этом роде. А не могли бы Вы пояснить подробнее это регулярное выражение: return exp.match(/(\-?\d+)/g)

рони 27.02.2017 13:12

Zmicer,
выделить из строки всё похожее на число или отрицательное число

ksa 27.02.2017 13:31

Цитата:

Сообщение от Zmicer
А не могли бы Вы кратко прокомментировать этот код
...
А что делает эта волшебная строка?
...
А не могли бы Вы пояснить подробнее это регулярное выражение: return exp.match(/(\-?\d+)/g)

Думается пора тебе книжечки по JS почитать... ;)

Zmicer 27.02.2017 15:48

Цитата:

Сообщение от ksa (Сообщение 445708)
Думается пора тебе книжечки по JS почитать... ;)

Возможно, но я JS редко пользуюсь. Хотя, если подскажете нормальную книгу по OOP JS, не очень толстую и написанную не слишком заумным языком, буду премного благодарен! Можно на английском

ksa 27.02.2017 15:56

Цитата:

Сообщение от Zmicer
если подскажете нормальную книгу по OOP JS, не очень толстую и написанную не слишком заумным языком

Начать можно с этой...


Paguo-86PK 27.02.2017 16:08

Цитата:

Сообщение от Zmicer (Сообщение 445735)
Возможно, но я JS редко пользуюсь. Хотя, если подскажете нормальную книгу по OOP JS, не очень толстую и написанную не слишком заумным языком, буду премного благодарен! Можно на английском

Кажeтся, программист просто обязан переваривать документацию и на дико заумном языке!:blink: Хоть на языке Майя:p

P.S.: Кстати, тестер регулярок
Тем более, регулярки - и в Perl, и в PHP в первую очередь вводились.
В JS регулярки, так, опционально-мимоходов внедрились;)
Цитата:

Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером. Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache.

Zmicer 28.02.2017 11:04

Цитата:

Сообщение от ksa (Сообщение 445736)
Начать можно с этой...

А вам бы все прикалываться :) Ладно, куда уж мне до гуру! Кстати, вчера нашел очень неплохую ксёнжку, простите мне мой польский, и именно по ООП как раз для моего уровня JS Фримен Э., Робсон Э. - Изучаем программирование на JavaScript - 2015 :victory:


ksa 28.02.2017 11:27

Цитата:

Сообщение от Zmicer
А вам бы все прикалываться

Отнють! Я с нее и начинал.
Мне вообще нравятся книжки из серии "Для чайников" и "За 24 часа". Они быстро дают представление о некоем "направлении".
Порой бывает достаточно и его. Если не достаточно - в ход идут книги толще и более специфичнее...

Alexandroppolus 28.02.2017 11:47

Я думаю, надо с учебника начать - https://learn.javascript.ru/
А то в книжках может быть хрень, антипаттерны, бэд-практисы. А тут все на виду, если что - на форуме скажут )

NeoN 28.02.2017 12:54

мой вариант просто так)

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, время: 11:49.