Неправильно сортируется обьект
Сортирую объект, но на выходе не сортируется правильно.
Нужно так [А-ЯA-Z0-9] , а получается только так [0-9А-ЯA-Z] . Идей вообще никаких, уже все перепробовал. https://codepen.io/dmgrig/pen/LYdeGVy?editors=0011 |
Цитата:
|
Цитата:
|
Цитата:
var nws = []; //возвращаем отсортированный исходный массив sortmas.forEach((key)=> { nws.push(key) ; }); console.log("Получается так:\t\t"+nws); |
dimas15,
какая задача, что нужно получить из исходного массива? |
Цитата:
|
Цитата:
|
dimas15,
Цитата:
цель ваших манипуляций в итоге? |
Цитата:
|
dimas15,
ключи объекта в объекте не сортируются!!! |
dimas15,
сортируйте массив!!! |
Цитата:
|
dimas15,
я пас, может кто-то другой вам поможет ... |
dimas15,
попробуем ещё раз))) чем вас сортировка массива не устраивает? зачем надо игры с объектами и ключами устраивать? |
Цитата:
Все продукты А-Я Все А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ш Щ Э A B C D E F G H I K L M N O P Q R S T U V W 2 2 2-Меркапт А Агар Агидол-2 ... Делаю все это из массива обьектов: [ { "name": "2-этилгексил", "url": "2-этилг", "id": 1020 }, { "name": "Acralen", "url": "Acra", "id": 193 }, { "name": "Acr5028", "url": "Acr", "id": 1295 }, ... ... .... ] Преобразую в это: [ 2: [{ "name": "2-этилге", "url": "2-этилгек", "id": 1020 },...], A: [ { "name": "Acralen", "url": "Acralen", "id": 193 }, { "name": "Acro5028", "url": "Acro5028", "id": 1295 },...] .....] И сортирую этот обьект массивов по ключам 2,А,Б,A,D... В итоге все сортируется почти так как надо, только цифры идут первыми а они должны идти в конце. "Нужно так: А,Б,В,Г,Д,Е,Ж,З,И,К,Л,М,Н,О,П,Р,С ,Т,У,Ф,Х,Ц,Ш,Щ,Э,A,B,C,D,E,F,G,H,I,K,L,M,N ,O,P,Q,R,S,T,U,V,W,2" "Получается так(цифры сортируются в начале а не в конце массива): 2,А,Б,В,Г,Д,Е,Ж,З,И,К,Л,М,Н,О,П,Р, С,Т,У,Ф,Х,Ц,Ш,Щ,Э,A,B,C,D,E,F,G,H,I,K,L,M ,N,O,P,Q,R,S,T,U,V,W" //перестраиваю массив обьектов. const modmas = obj.reduce((a, b) => { const first = b.name[0].toUpperCase(); if (!a[first]) { a[first] = []; } a[first].push(b); return a; },{}) //проверяю тип данных и преобразую числа из string в number var arr = []; var mm = Object.keys(modmas); var length = mm.length; for (var i = 0; i < length; i++){ if (!isNaN(mm[i]) === true) { arr.push(Number(mm[i])); } else { arr.push(mm[i]); } } //сортирую const collator = new Intl.Collator('ru'); const sortmas = arr.sort(function (a, b) { if(isNaN(a) && !isNaN(b)){ return -1; }else if(!isNaN(a) && isNaN(b)){ return 1; } return collator.compare(a, b); /*return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });*/ }) var nws = {}; //возвращаем отсортированный исходный массив с вложенными данными sortmas.forEach((key)=> { nws[key] = modmas[key]; }); console.log(":\t\t"+Object.keys(nws)); |
Цитата:
лучше так [{first, data : []} , {first, data : []}...., {first : "2", data : []}] |
Цитата:
Если проходить объект через for in поряок будет один (всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект. Такой порядок не определен в спецификации, но его придерживаются все браузеры), если смотреть в отладчике, то порядок будет другой (отсортирован по алфавиту) |
dimas15,
const collator = new Intl.Collator(["ru", "en"], { numeric: true }); let arr = obj.slice(0).sort((a, b) => { let numA = (/^\d+/).test(a.name), numB = (/^\d+/).test(b.name); if (numA && !numB) return 1; if (!numA && numB) return -1; return collator.compare( a.name, b.name ) } ); const modmas = []; let temp = {}; for (const el of arr) { const first = el.name[0].toUpperCase(); if (temp.first != first) { temp = { first, data: [] }; modmas.push(temp) }; temp.data.push(el) } console.log(modmas); const keys = modmas.map(({first}) => first); console.log(keys); |
Цитата:
|
Цитата:
Еще раз повторю Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
И это меня каждый раз как об этом вспоминаю вводит в состояния бешенства.) Каким безумным извращенцем надо было быть чтобы такое придумать и главное зачем?! Уму непостижимо. Чем им плох был изначальный вариант с простым порядком по мере добавления... |
Aetae,
по хорошему в объекте вообще не должно быть какого-то определенного порядка ключей, даже на уровне идеи. Если нужен порядок, есть массив или какие-либо иные структуры, например дерево сортировки. Тогда и не будет бессмысленных вопросов вроде этого топика. |
Цитата:
ECMAScript 2023 https://tc39.es/ecma262/#sec-enumera...ect-properties Так и сказано 14.7.5.9 Цитата:
|
Цитата:
Текущая реализация нифига не интуитивна и нифига не удобна, реализация с рандомным порядком - также нифига не интуитивна и не удобна. Такие дела. В седой древности подобных топиков тоже хватало, только касались они как раз НЕгарантированого порядка. Недолгое затишье было только когда на некоторое время все договорились просто делать по мере добавления, но всё быстро снова сломали.) Цитата:
|
Цитата:
я вообще долгое время не знал, что в объектах (да и в Map) может быть какой-то порядок, и всегда для таких задач пользовался массивами - там порядок задан явно. |
Цитата:
Новый вариант правил размещения позволяет размещать объекты в памяти с применением реляционной алгебры в частности V8 использует красно черные бинарные деревья что позволяет математически оптимально размещать и использовать данные. Это сделано с целью упрощения реализации позволило удалить из движка JS отдельный не нужный механизм хранящий ссылки на данные, порядок их размещения и данные индексации. В общем сделали протестили и продавили новый вариант в стандарт. |
Часовой пояс GMT +3, время: 04:11. |