| 
	| 
	
	| 
		
	| 
			
			 
			
				30.07.2022, 20:39
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| dimas15,сортируйте массив!!!
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 20:43
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 21.08.2012 
						Сообщений: 86
					 
		
 |  |  
	| 
	
 
	| Сообщение от рони   |  
	| dimas15, ключи объекта в объекте не сортируются!!!
 |  
	
 Согласен, я взял массив из обьекта который состоит из ключей, потом отсортировал его и сопоставил этот массив с массивом в обьекте. |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 20:54
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| dimas15,я пас, может кто-то другой вам поможет ...
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 21:50
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| dimas15,попробуем ещё раз)))
 чем вас сортировка массива не устраивает? зачем надо игры с объектами и ключами устраивать?
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:23
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 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.
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:28
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| 
	
 
	| Сообщение от dimas15 |  
	| Преобразую в это: 
 [ 2: [{
 |  
	
 это бред  
лучше так  
[{first, data : []}  , {first, data : []}....,  {first : "2", data : []}] |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:40
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.02.2020 
						Сообщений: 2,777
					 
		
 |  |  
	| 
	
 
	| Сообщение от dimas15 |  
	| В итоге все сортируется почти так как надо |  
	
 А как вы это определяете? 
Если проходить объект через for in поряок будет один (всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект. Такой порядок не определен в спецификации, но его придерживаются все браузеры), если смотреть в отладчике, то порядок будет другой (отсортирован по алфавиту)			 Последний раз редактировалось voraa, 30.07.2022 в 22:48.
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:45
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| 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);
 |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:47
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 21.08.2012 
						Сообщений: 86
					 
		
 |  |  
	| 
	
 
	| Сообщение от voraa   |  
	| А как вы это определяете? Если проходить объект через for in поряок будет один (всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект), если смотреть в отладчике, то порядок будет другой (отсортирован по алфавиту)
 |  
	
 По алгоритму сортировки. Типа получил кличи обьекта отсортировал, сопоставил с массивом обьектов и вуаля, все получилось кроме цифр. есть подозрение что при сопоставлении цифры в обьекте читаются как стринг, но нет. |  |  
	| 
		
	| 
			
			 
			
				30.07.2022, 22:57
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.02.2020 
						Сообщений: 2,777
					 
		
 |  |  
	| 
	
 
	| Сообщение от dimas15 |  
	| По алгоритму сортировки |  
	
 Как вы узнаете, в каком порядке у вас расположились ключи?
 
Еще раз повторю 
	
 
	| Сообщение от voraa |  
	| всегда сначала все численные ключи в порядке возрастания, потом остальные ключи в порядке их добавления в объект. Такой порядок не определен в спецификации, но его придерживаются все браузеры |  
	
 |  |  |  |