Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 30.07.2022, 20:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

dimas15,
сортируйте массив!!!
Ответить с цитированием
  #12 (permalink)  
Старый 30.07.2022, 20:43
Аспирант
Отправить личное сообщение для dimas15 Посмотреть профиль Найти все сообщения от dimas15
 
Регистрация: 21.08.2012
Сообщений: 86

Сообщение от рони Посмотреть сообщение
dimas15,
ключи объекта в объекте не сортируются!!!
Согласен, я взял массив из обьекта который состоит из ключей, потом отсортировал его и сопоставил этот массив с массивом в обьекте.
Ответить с цитированием
  #13 (permalink)  
Старый 30.07.2022, 20:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

dimas15,
я пас, может кто-то другой вам поможет ...
Ответить с цитированием
  #14 (permalink)  
Старый 30.07.2022, 21:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

dimas15,
попробуем ещё раз)))
чем вас сортировка массива не устраивает? зачем надо игры с объектами и ключами устраивать?
Ответить с цитированием
  #15 (permalink)  
Старый 30.07.2022, 22:23
Аспирант
Отправить личное сообщение для dimas15 Посмотреть профиль Найти все сообщения от dimas15
 
Регистрация: 21.08.2012
Сообщений: 86

Сообщение от рони Посмотреть сообщение
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));

Последний раз редактировалось dimas15, 31.07.2022 в 12:34.
Ответить с цитированием
  #16 (permalink)  
Старый 30.07.2022, 22:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Сообщение от dimas15
Преобразую в это:

[ 2: [{
это бред
лучше так
[{first, data : []} , {first, data : []}...., {first : "2", data : []}]
Ответить с цитированием
  #17 (permalink)  
Старый 30.07.2022, 22:40
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Сообщение от dimas15
В итоге все сортируется почти так как надо
А как вы это определяете?
Если проходить объект через for in поряок будет один (всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект. Такой порядок не определен в спецификации, но его придерживаются все браузеры), если смотреть в отладчике, то порядок будет другой (отсортирован по алфавиту)

Последний раз редактировалось voraa, 30.07.2022 в 22:48.
Ответить с цитированием
  #18 (permalink)  
Старый 30.07.2022, 22:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

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);
Ответить с цитированием
  #19 (permalink)  
Старый 30.07.2022, 22:47
Аспирант
Отправить личное сообщение для dimas15 Посмотреть профиль Найти все сообщения от dimas15
 
Регистрация: 21.08.2012
Сообщений: 86

Сообщение от voraa Посмотреть сообщение
А как вы это определяете?
Если проходить объект через for in поряок будет один (всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект), если смотреть в отладчике, то порядок будет другой (отсортирован по алфавиту)
По алгоритму сортировки. Типа получил кличи обьекта отсортировал, сопоставил с массивом обьектов и вуаля, все получилось кроме цифр. есть подозрение что при сопоставлении цифры в обьекте читаются как стринг, но нет.
Ответить с цитированием
  #20 (permalink)  
Старый 30.07.2022, 22:57
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Сообщение от dimas15
По алгоритму сортировки
Как вы узнаете, в каком порядке у вас расположились ключи?

Еще раз повторю
Сообщение от voraa
всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект. Такой порядок не определен в спецификации, но его придерживаются все браузеры
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новый обьект или вызов функции greenrow_ty Общие вопросы Javascript 5 03.10.2016 20:54
Как из строки получить обьект? linklee Общие вопросы Javascript 22 15.07.2013 18:11
обьект Image неправильно возвращает height, width Andrey1205 Элементы интерфейса 8 10.06.2012 16:06
Обьект из строки Andrejs Элементы интерфейса 7 06.07.2011 17:19
Скрипт неправильно работает в FF InviS Общие вопросы Javascript 6 11.04.2010 16:56