Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сортировка массива с сохранением ключей (https://javascript.ru/forum/misc/68665-sortirovka-massiva-s-sokhraneniem-klyuchejj.html)

denis82 30.04.2017 20:02

Сортировка массива с сохранением ключей
 
Добрый день.

Подскажите кому не лень. Вроде задача тривиальная, но что-то не допереть, а поиском не нашел.

Требуется отсортировать массив по алфавиту с сохранением ключей. Допустим массив такой:
models[79][19709] = 'Creta';
models[79][19701] = 'Coupe';
models[79][19725] = 'ix35';

Применяю сортировку по алфавиту
models[79].sort();

Но ключи не сортируются, то есть после сортировки массив имеет вид:
models[79][0] = 'Coupe';
models[79][1] = 'Creta';
models[79][2] = 'ix35';

а должно быть
models[79][19701] = 'Coupe';
models[79][19709] = 'Creta';
models[79][19725] = 'ix35';

рони 30.04.2017 20:23

denis82,
у вас наверно обьект, а не массив

denis82 02.05.2017 12:02

Нет, ассоциативный массив.

laimas 02.05.2017 12:32

Цитата:

Сообщение от denis82
ассоциативный массив

Нет в JS ассоциативных массивов.

denis82 02.05.2017 12:55

https://learn.javascript.ru/object
Объект как ассоциативный массив, который нужно отсортировать по значению, но с сохранением ключей.

рони 02.05.2017 12:59

denis82,
нет сортировки обьекта в js, попробуйте уточнить данные и задачу.

laimas 02.05.2017 13:07

denis82,
[19701 => 'Coupe', 19709 => 'Creta', 19725 => 'ix35'], это не ассоциативный, а индексный массив. В JS, это будет объект, метода sort() у него нет.

denis82 02.05.2017 13:09

Ну хорошо, а как сортировать его?

рони 02.05.2017 13:20

denis82,
превратить массив(у вас массив длиной 19725) в обьект с длиной 3 и написать функцию чтобы выдавала вам данные в том виде каком нужно.

рони 02.05.2017 13:21

если в строке 3 будет обьект, то сортировка выкинет ошибку
<script>
var models = {};
models[79] = [];

models[79][19709] = 'Creta';
models[79][19701] = 'Coupe';
models[79][19725] = 'ix35';
models[79].sort();
alert(models[79]);
</script>

рони 02.05.2017 13:27

denis82,
<script>
var models = {};
models[79] = [];

models[79][0]= {'19709' : 'Creta'};
models[79][1]= {'19701' : 'Coupe'};
models[79][2]= {'19725': 'ix35'};
models[79].sort(function() {
    // тут можно сортировать как вам нужно, если будет как структура выше
});
alert(models[79]);
</script>

рони 02.05.2017 13:36

denis82,
<script>
var models = {};
models[79] = [];

models[79][0]= {'19709' : 'Creta'};
models[79][1]= {'19701' : 'Coupe'};
models[79][2]= {'19725': 'ix35'};
models[79].sort(function(a,b) {
  for(var k in a) a = k;
  for(var k in b) b = k;
  return a - b});
document.write(JSON.stringify(models[79]));
</script>

denis82 02.05.2017 18:35

Да, спасибо, Рони, наверное так и нужно делать. Но как тогда потом на выходе получить такой формат:
models[79][19701] = 'Coupe';
models[79][19709] = 'Creta';
models[79][19725] = 'ix35';

рони 02.05.2017 19:32

Цитата:

Сообщение от denis82
Но как тогда потом на выходе получить такой формат

никак

рони 02.05.2017 19:39

denis82,
либо вы измените структуру данных и потом сортируите как угодно, либо забудьте о сортировке.

laimas 03.05.2017 09:22

Цитата:

Сообщение от denis82
наверное так и нужно делать

Данные откуда, кто их формирует в такую структуру? Если это данные из базы, то почему сразу запросом не отсортировать их?

Цитата:

Сообщение от denis82
на выходе получить такой формат

Для чего? Собственно так models[79][19701] и можно получить данные из объекта, а каков синтаксис его описания вам какая разница?

denis82 03.05.2017 17:19

Данные сортируются на стороне клиента в браузере - зависимые списки: марка, модель, поколение, серия, модификация автомобилей. Марки сортирую из БД запросом, но остальные списки сортировать нужно на js. То есть выбрал марку, в зависимости от нее построился список моделей отсортированный по алфавиту с сохранением ключей, чтобы дальше при отправке на сервер передались нужные ключи. Есть скрипт, который управляет списками, подгружая нужный список в зависимости от выбранного, поэтому и желательно подстроить под него синтаксис. Как-то не думал что такие сложности с сортировкой возникнут. В js я совсем слаб, уж простите.

laimas 03.05.2017 17:29

Цитата:

Сообщение от denis82
То есть выбрал марку, в зависимости от нее построился список моделей отсортированный по алфавиту с сохранением ключей, чтобы дальше при отправке на сервер передались нужные ключи.

То есть если поля формы или иные данные отдаваемые клиентом серверу не будут сортированы, то сервер получит "ненужные ключи"? Что за глупость :)

Цитата:

Сообщение от denis82
Марки сортирую из БД запросом, но остальные списки сортировать нужно на js.

С чего вдруг если речь о зависимых списках? Даже если списки не получаются асинхронным запросом, а строятся уже по отданным клиенту данным, это же не мешает их заведомо отсортировать.

denis82 03.05.2017 19:31

Имею в виду что если сделать сортировку, как я писал в первом посте, то ключи присвоятся по порядку: 0, 1, 2, 3 и т.д.

Я пробовал сортировать заранее при выводе данных из базы, сортируется корректно, но после этого
models[<?php echo $id_brand; ?>][<?php echo $k; ?>] = '<?php echo $v; ?>';
в поле select сортировка как будто игнорируется. Вот почему и стал думать как корректно сортировать массив на js. Не могу понять почему сортировка слетает.

foreach ($array2 as $k=>$v) {
$title_model = $v;
$id_model = $k;
?>
models[<?php echo $id_brand; ?>][<?php echo $id_model; ?>] = '<?php echo $title_model; ?>';
<?php
}

рони 03.05.2017 19:38

denis82,
ещё раз: на выходе у вас разреженный массив -- при сортировке -- все значения сдвигаются к началу массива - ключи в данном случае не ключи, а индексы массива -- нужны ключи => делайте обьект -- но обьект невозможно отсортировать, но можно как угодно извлечь данные.

denis82 03.05.2017 20:54

Читаю про объекты. Вот грубо набросал, но где-то накосячил. В верном направлении хотя бы ковыряю?

var models = {};
<?php
foreach ($array2 as $k=>$v) {
$title_model = $v;
$id_model = $k;
?>
models = {<?php echo $id_model; ?>:<?php echo $title_model; ?>}
for (var key in models) {
models[<?php echo $id_brand; ?>][key] = 'models[key]';
}
<?php } ?>

laimas 03.05.2017 21:13

Цитата:

Сообщение от denis82
В верном направлении хотя бы ковыряю?

Нет. json_encode(array).


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