2014-02-06 4 views
-3

Я новичок в 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 

Спасибо заранее.

+5

На самом деле это объект. –

+0

Как я могу работать с массивом и поддерживать порядок? – cecilli0n

+0

Как сказано здесь, объект не является массивом. Узнайте, что такое [Array] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) и [Object] (https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) находятся в Javascript. – Xotic750

ответ

4

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

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

Looping над тем, как так

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

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

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

Другой Edit: Проблема в том, что вы пытаетесь есть массив, который имеет свойство и значение так же, как объект, без использования объекта, {свойство: значение} - это не может действительно быть сделано с массив. Для цикла по массиву, как вы хотите, это так просто, как

var arr = [1,2,3] 

и

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

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

+1

Ну, он может 't * just * изменить начальную декларацию; синтаксис инициализации также отличается. – Pointy

+0

Pointy это то, что я только что пробовал, и в самом деле это не удалось, довольно бесполезное заявление. Однако вместе с этим, когда я получил правильный синтаксис для создания массива, мой вопрос по-прежнему остается без ответа относительно того, как перебирать его и выполнять основной порядок, я просто попробовал снова с указанными мной петлями и той же проблемой, что и у меня с объектом существует внутри массива. – cecilli0n

+0

@ cecilli0n попробуйте сейчас. Извините, редактировал ответ. –

0

Я не понимаю. Что заставляет вас думать, что 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.

Затем я перебираю массив с параметром for/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 или о том, что у меня есть автомобиль - все атрибуты, которые могли бы квалифицироваться как данные, которые описывали бы некоторые аспекты меня. (Однако, по договоренности, вы часто можете рассказать пол человека по их имени)

+0

Что заставляет меня думать о нем в любом порядке? Тот факт, что я пишу его в этом порядке. Что касается меня, используя имена членов для доступа к данным, а также их отдельно, это обычная практика в php. Например, если у нас есть база данных, мы можем использовать имя столбца (ключ) для доступа к ее значению. Однако ваш комментарий кажется чтобы я поверила, что в JavaScript существует большая разница в массивах в сравнении с массивами на PHP, я пойду и буду исследовать сейчас. – cecilli0n

+0

Нет. Предположим, у меня есть таблица базы данных, в которой хранятся данные банковского счета. Имя столбца (например, «account_balance») не является частью данных этого столбца. Данные этой колонки для любой данной строки могут быть 373,24 или -12,47 или 1,000,000. Имя «account_balance» абсолютно ничего не говорит о моем балансе аккаунта, и он абсолютно ничего не говорит о моем номере учетной записи.Это, как вы говорите, используется для доступа к его ценности. Это не часть этой ценности. И это то же самое в базах данных, PHP, JavaScript и действительно везде. – Andrejovich

+0

В вашем основном ответе вы написали «Индекс - это индекс, имя - это имя, а данные - данные», это можно прочитать, что вы говорили о 3 частях массива, что заставило меня поверить, что вы определили данные как весь массив. Для ясности не было бы лучше просто написать индекс - это индекс, значение - значение. Кроме того, в первом разделе вашего второго комментария прямо выше вы используете термин «данные», в то время как в более позднем разделе вы используете значение термина. Придерживаясь ваших определений, эти термины используются и для разговоров о том же, поэтому почему бы просто не использовать один термин во всем? – cecilli0n

1

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

Массив

Массивы список подобных объектов, чьи прототип имеет методы для выполнения обхода и мутации операций. Исправлена ​​ни длина массива 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 
} 
Смежные вопросы