2013-03-06 4 views
1

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

Я получаю ассоциативный массив (объект) через AJAX. Я могу проверить его структуру по возвращении, и это правильно. Например:

48 => Value1 
50 => Value2 
49 => Value3 
51 => Value4 

Но, когда я прохожу через него, цикл for переупорядочивает объект. Это связано с тем, что ключи-помощники являются числовыми. Они представляют числовые идентификаторы из базы данных. Я не знал, что javascript задушит их и попытается превратить их в основные ключи массива в числовом порядке. Итак, это выплевывается как:

48 => Value1 
49 => Value3 
50 => Value2 
51 => Value4 

Как я могу пропустить объект в том порядке, в котором я его строю? Должен ли я строить объект со строками в качестве ключей? Как «ID22», заменяющий 22. Или существует какой-то способ заставить javascript зацикливаться в определенном порядке?

Спасибо! Мэтт

+0

Обычно я использую ["_" + i], поэтому я не допускаю никаких путаниц. Плюс на некоторых языках (php ??), добавляя индекс 49, а затем 51 будет автоматически загружать индекс 50, который я не так рад ... Кроме того, как много раз прокомментировал здесь в SOverflow, ассоциативные массивы не являются правильными технически говорящими в javascript. Если я правильно помню, следует использовать объекты и свойства. – Sebas

+0

Возможный дубликат [Порядок элементов в a для (... in ...) »loop (http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop) – Aaron

+0

Спасибо, Себас , На самом деле это объекты. Я просто знал, что объекты были ответом javascript на ассоциативные массивы (ala-языки, такие как php), поэтому я назвал его «объектом» в parens.:-) – Mattaton

ответ

1

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

Лучший способ решить эту проблему - создать 1 объект и один массив, чтобы сохранить порядок:

var values = { 
    48: "Value1" 
    50: "Value2" 
    49: "Value3" 
    51: "Value4" 
} 
var order = [48, 50, 49, 51] //put proterty id here to keep order eg. [51, 50, 49, 48] 
+0

Это будет работать. – sweetamylase

+0

Спасибо! Теперь я просто пытаюсь понять, как упаковать все это, чтобы он работал на стороне php и стороне javascript. Вместо того, чтобы передавать один php-массив (JSON, закодированный, а затем проверенный JS) назад, я должен передать массив и объект обратно. Мне придется кое-что переделать. – Mattaton

+0

Он работает! Благодаря! – Mattaton

0

Это только действительно проблема с Chrome, у них есть ошибка для него, но это «Вона» t Fix "для внутренней эффективности.

Лучший способ я нашел, чтобы обойти эту проблему заключается в изменении использования объекта:

{ 
    48: "Value1" 
    50: "Value2" 
    49: "Value3" 
    51: "Value4" 
} 

вместо этого массива, как так:

[ 
    {id: 48, value: "Value1"}, 
    {id: 50, value: "Value2"}, 
    {id: 49, value: "Value3"}, 
    {id: 51, value: "Value4"} 
] 

Он заканчивает тем, что было гораздо больше, чистым, чем альтернативный метод обхода (который, как вы изначально предлагали)

+0

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

+0

. Это главный недостаток этого, я имею тенденцию использовать функцию objById, которая только петли для функции value objById (arr, id) {for (var x = 0; x Doug

0

Я считаю, что вы используете for…in для получения вашего ключа и значения.

Как указано выше, и как указано в ECMAScript specs, «Механика и порядок перечисления свойств (шаг 6.a в первом алгоритме, шаг 7.a во втором) не указывается».

Это значит, что вы не можете положиться вовсе на заказ, который вы получите через for…in или Object.keys. Если заказ важен для вас, вам нужно где-то хранить индекс заказа и сортировать данные по этому свойству. Вы не можете использовать просто Object.

Смежные вопросы