Ведение заказа массива в Javascript

Я новичок в JavaScript, и мне не удается работать с моим массивом, я хочу, чтобы мой массив заказал, как я явно пишу его, а не как JavaScript решает, что он этого хочет.

Если у нас есть массив

var array = { 0: 'zero', 4: 'four', 2: 'two' }; 

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

 array = { 0: 'zero', 2: 'two', 4: 'four' }; 

Я уже пробовал 2 цикла, цикл for, а также цикл for с инструкцией in. Оба работают в соответствии с тем, как я предполагал, что они будут использовать ключ и работать там вверх / вниз, делая заказ, который я указываю, абсолютно бесполезен.

Как я могу писать / печатать / работать с моим массивом в качестве упорядоченного. В других языках, таких как PHP, это так же просто, как

 $array = array( 0 => 'zero', 4 => 'four', 2 => 'two' ); foreach($array as $key => $value) echo $key ."\n"; 

Это приведет к выводу

 0 4 2 

Заранее спасибо.

Related of "Ведение заказа массива в Javascript"

Вы используете объект {} , а не массив [] . Объекты не имеют явного порядка, где массивы. Вот почему у вас проблемы. Измените свой {} на [] и все будет в порядке. Вы даже можете использовать массив объектов.

 var array = [ {0: 'zero'}, {4: 'four'}, {2: 'two'} ]; 

Наверное,

 for(var i = 0; i < array.length; i++){ console.log(array[i]); } 

Дает нам наш нормальный порядок.

 Object {0: "zero"} Object {4: "four"} Object {2: "two"} 

Другое Редактирование. Проблема заключается в том, что вы пытаетесь создать массив, который обладает свойствами и значениями точно так же, как объект, без использования объекта, {property: value} – это невозможно сделать с помощью массива. Чтобы перебрать массив, как вы хотите, это так просто, как

 var arr = [1,2,3] 

а также

 for(var i = 0; i < arr.length; i++){ console.log(i) //1,2,3 } 

но проблема, как упомянуто выше, заключается в том, что вам нужны более сложные массивы, которые вы просто не можете сделать.

Вам нужно понять, что такое Массив и какой объект , они принципиально разные вещи и не ведут себя одинаково.

массив

Массивы представляют собой объекты, подобные спискам, у прототипа которых есть методы для выполнения операций обхода и мутации. Исправлена ​​ни длина массива JavaScript, ни типы его элементов. Так как размер размера массива растет или уменьшается в любое время, массивы JavaScript не гарантируют, что они будут плотными. В общем, это удобные характеристики; но если эти функции нежелательны для вашего конкретного использования, вы можете рассмотреть использование типизированных массивов.

Примеры массива, обратите внимание на свойство магической length , значения, назначенные массиву, всегда находятся в их индексированных местоположениях; индекс от 0 до 2 ^ 32 – 1

 // dense arrays var array1 = [1, 2, 3]; array1.length === 3; array1[0] === 1; var array2 = []; array2[0] = 1; array2[1] = 2; array2[2] = 3; array2.length === 3; array1[1] === 2; var array3 = []; array3.push(1); array3.push(2); array3.push(3); array3.length === 3; array3[2] === 3; // and a sparse array var array4 = []; array4[0] = 1; array4[2] = 2; array4[4] = 3; array4.length === 5; array4[1] === undefined; 

Итерирование массива for

 var array = [1, 2, 3, 4, 5]; for (var index = 0; index < array.length; index += 1) { // counts from (index) 0 to 4 console.log(index, array[index]); // outputs 0 1 \n 1 2 \n 2 3 \n 3 4 \n 4 5 } 

объект

Объект представляет собой набор свойств, а свойство – это ассоциация между именем и значением. Значение свойства может быть функцией, и в этом случае свойство известно как метод. В дополнение к объектам, которые предопределены в браузере, вы можете определить свои собственные объекты.

Примеры объекта, нет свойства магической length .

 var object1 = { 'zero': 1, 'one': 2, 'two': 3 }; object1.zero === 1; var object2 = {); object2['zero'] = 1; object2['one'] = 2; object2['two'] = 3; object2.one === 2; var object3 = {); object3.zero = 1; object3.one = 2; object3.two = 3; object['two'] === 3; 

Итерирование (перечисление) объекта для for..in

 var object = { one: 0, two: 1, three: 2 }; for (var property in object) { if (object.hasOwnProperty(property)) { // make sure the property belongs to object console.log(property, object[property]); // outputs (not necessarily this order) // three 2 \n two 1 \n one 0 } }; 

Если вы пытаетесь сохранить упорядоченный объект, то это не то, как работает Javascript, и итерация (перечисление) объекта является произвольной. Существуют методы, которые вы можете использовать для итерации (перечисления) объекта в известном порядке. Это требует сохранения упорядоченного списка свойств в массиве и использования массива в процессе итерации.

 var object = { 'c': 1, 'z': 2, 'b': 3, 'a': 4 } var propertyOrder = ['c', 'z', 'b', 'a']; for (var index = 0; index < propertyOrder.length; index += 1) { console.log(index, propertyOrder[index], object[propertyOrder[index]]); // outputs 0 c 1 \n 1 z 2 \n 2 b 3 \n 3 a 4 } 

Я не понимаю. Что заставляет вас думать, что 0, затем 4, затем 2, в любой форме или форме «по порядку»?

Однако, по-видимому, вы хотите сохранить число и строку вместе в указанном вами порядке .

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

Вы не можете, и вы не должны. Индекс – это индекс, имя – это имя, а данные – данные [1] .

Вот два варианта хранения ваших чисел и строк:

 var pairs = [ [0, "zero"], [4, "four"], [2, "two"] ]; for (var index in pairs) { alert(pairs[index][0] + ": " + pairs[index][1]); }; 

Для этого я сохраняю пары чисел и строк вместе в собственных массивах: числа в позиции 0, строки в позиции 1. Я храню эти массивы pairs .

Затем я перебираю массив с помощью / in, который на каждой итерации дает мне индекс моего массива pairs .

Затем я использую этот индекс для доступа к правому подматрицу в pairs и получаю номер из позиции 0 и строку из позиции 1.

 var pairs = [ {number: 0, string: "zero"}, {number: 4, string: "four"}, {number: 2, string: "two"} ]; for (var index in pairs) { alert(pairs[index].number + ": " + pairs[index].string); }; 

Это работает точно так же, за исключением хранения пар в массивах, я храню их в объектах.

У этого есть дополнительный бонус лучшей читаемости внутри цикла for: pairs[index][0] и pairs[index][1] самом деле не дают ясного смысла. Это говорит нам не что иное, как «о парах с данным индексом, получить пункты 0 и 1».

Однако pairs[index].number и pairs[index].name намного яснее: «пары с данным индексом, дайте мне номер и имя».

_

Примечания:

[1a] Номер – это номер : мой номер банковского счета – это только то, что: средство для идентификации моего банковского счета. Он не передает никакого значения моего имени, моего ПИН-кода или баланса на моем счете – все атрибуты, которые будут квалифицироваться как данные, принадлежащие моему банковскому счету.

[1b] Имя – это имя : мое имя – просто имя. Когда вы говорите обо мне, вы можете использовать мое имя, чтобы сослаться на меня, чтобы другие знали, о ком вы говорите. Мое имя не передает никакой информации о моих хобби, моем SSN или о том, что у меня есть автомобиль – все атрибуты, которые могли бы квалифицироваться как данные, которые описывали бы некоторые аспекты меня. (Однако, по соглашению, вы часто можете указать пол человека по имени)