Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятный момент в примере функции сравнения (https://javascript.ru/forum/misc/36947-neponyatnyjj-moment-v-primere-funkcii-sravneniya.html)

Ilja_Lv 01.04.2013 23:35

Непонятный момент в примере функции сравнения
 
Добрый день!

На stackoverflow нашёл пример функции, которая передаётся в .sort():
var sort_by = function(field, reverse, primer){
    var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; };

    return function (a,b) {
        var A = key(a), B = key(b);
        return ((A < B) ? -1 : (A > B) ? +1 : 0) * [-1,1][+!!reverse];                  
    };
};


Применение:
// Sort by price high to low
homes.sort(sort_by('price', true, parseInt));

// Sort by city, case-insensitive, A-Z
homes.sort(sort_by('city', false, function(a){return a.toUpperCase()}));



Помогите, пожалуйста, понять, что означает вот это выражение:
* [-1,1][+!!reverse];

Спасибо!

nikita.mmf 02.04.2013 00:17

1) !! - приводит значение переменной к Boolean: true or false;
2) + - приводит значение к Number, т.к. применяется к Boolean, то результат 0 or 1;
3) берем либо элемент массива с индексом = 0 or 1;

Ilja_Lv 02.04.2013 00:52

Цитата:

Сообщение от nikita.mmf (Сообщение 243807)
1) !! - приводит значение переменной к Boolean: true or false;
2) + - приводит значение к Number, т.к. применяется к Boolean, то результат 0 or 1;
3) берем либо элемент массива с индексом = 0 or 1;

Т.е., если я правильно понял, результат ((A < B) ? -1 : (A > B) ? +1 : 0) будет умножатся на 1 или -1, в зависимости от состояния reverse?

Aetae 02.04.2013 01:07

Цитата:

Сообщение от Ilja_Lv (Сообщение 243814)
Т.е., если я правильно понял, результат ((A < B) ? -1 : (A > B) ? +1 : 0) будет умножатся на 1 или -1, в зависимости от состояния reverse?

Да.
Код писал человек-обсфукатор.)

Ilja_Lv 02.04.2013 11:03

Спасибо! Теперь всё понятно. :)

rgl 02.04.2013 12:46

Можно слегка пооптимизировать, вместо того, тобы умножать
* [-1,1][+!!reverse]
сделать предварительно, перед функцией
reverse = [-1,1][+!!reverse]
и умножать уже просто
*reverse


Часовой пояс GMT +3, время: 22:53.