Показать сообщение отдельно
  #15 (permalink)  
Старый 17.08.2020, 18:30
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,701

До меня, наконец, дошел весь ужас ситуации.
Извращенцы из Adobe изгадили оператор ?:
Он у них ассоциативен слева-направо!!!
x = a>b? 1 : a<b? -1 : 0
выполняется, как
x = ( a>b ? 1 : a<b ) ? -1 : 0
со всеми вытекающими.

После расстановки скобок должно работать и в браузере и в Адобах

<script>
function nsort (a,b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    var re = /(\D*)((0*)(\d*))(.*)/;
    var ra = re.exec(a)
    var rb = re.exec(b)
    if (ra[4].length && rb[4].length) {
        if(ra[1] === rb[1]) {
            if (ra[3].length != rb[3].length) return rb[3].length - ra[3].length
            var na = +ra[2]
            var nb = +rb[2]
            if (na != nb) return na - nb;
        } else {
            return ra[1]>rb[1]? 1 : (ra[1]<rb[1]? -1 : 0)
        }
        if (ra[5].length || rb[5].length) return nsort(ra[5], rb[5])
        return 0;
    }
    return a>b? 1 : (a<b? -1 : 0);
}
 const arr = ["A", "B", "C", "x1a3", "x1a", "x1b", "x01a", "011", "g10", "x1a02", "g8", "g1", "g01", "g001", "g081", "11", "H", "x1a2", "b0", "b00"]
arr.sort(nsort)
console.log(arr)
 document.write(JSON.stringify(arr))
</script>


ЗЫ
В документации по ActionScript все равно говорится, что ?: правоассоциатевен
The assignment operators and the conditional ( ?: ) operator are right-associative, which means that the operators on the right are processed before operators on the left.
https://help.adobe.com/en_US/as3/lea...8a9b90204-7f6c

Наверно я чего то не врубаю.
var a = 3;
var b = 2;
var x = a>b? 1 : a<b? -1 : 0;
print(x)

выдает -1
а
var a = 3;
var b = 2;
var x = a>b? 1 : (a<b? -1 : 0);
print(x)

выдает 1, как и положено.

Последний раз редактировалось voraa, 17.08.2020 в 21:08.
Ответить с цитированием