2011-12-30 5 views
1

Некоторое свойство объекта/манипуляция массивом. Есть ли лучший синтаксис для выполнения частей 2 и 3?Свойства объекта javascript/манипуляция массивом

// 1. create object and add element/arrays 
var myObject = {}; 
myObject["123"] = { "A": 123, "B": 456 }; // add 
myObject["123"] = { "C": 123, "D": 456 }; // add more elements to array in element! 
myObject["124"] = { "A": 123, "B": 456 }; 
myObject["125"] = { "A": 123, "B": 456 }; 
console.log(myObject); 

// 2. delete first property in array 
for (property in myObject){ 
     delete myObject[property]; 
     break; 
    } 

// 3. show first remaining property 
for (property in myObject){ 
     x = property; 
     console.log("first remaining property is " + x); 
     break; 
    } 
+1

Назначения свойств в JavaScript не являются аддитивными. Вы заменяете полный объект, хранящийся в ключе '' 123 "' - '{" A ": 123," B ": 456};' во второй строке, а не добавляете больше элементов - '{" C ": 123, «D»: 456}, 'к нему. – Anurag

+0

Свойства не гарантируются итерацией по порядку. Поэтому вы не должны полагаться на свой код, чтобы удалить первое свойство http://stackoverflow.com/questions/5773950/how-to-keep-an-javascript-object-array-ordered-while-also-maintaining-key -lookup –

+0

На самом деле, мне действительно не нужно первое свойство ... достаточно откусить одно свойство за раз, и спасибо за оповещение о том, что я заменяю элементы! –

ответ

2

Я не уверен, почему вы только на полпути с вашим литеральным синтаксисом объекта (JSON имитирует объявления литерала объекта), но он также создал ошибку для вас. Вы переписываете myObject ["123"] во втором назначении.

Вы могли бы гораздо проще написать, что весь раздел 1 как:

var myObject = { 
    "123": { 
     "A": 123, 
     "B": 456, 
     "C": 123, 
     "D": 456 
    }, 
    "124": { 
     "A": 123, 
     "B": 456 
    }, 
    "125": { 
     "A": 123, 
     "B": 456 
    } 
} 

Второй и третий, нет такого понятия, как «первое свойство в массиве.» Это довольно распространенная ошибка для людей, которые пишут javascript (а не только новые люди, но люди, которые писали его в течение многих лет).

ни при каких обстоятельствах каких-так всегда является какой-либо частью объекта когда-либо «Первым» или «второго» или имеют какой-либо порядок в объекте. Это четко указано в спецификации ECMA-262. Производители браузеров иногда приспосабливаются к этому поведению, поэтому «он работает» иногда.

Это потому, что объекты не являются массивами, и они никогда не будут. Если вы хотите, чтобы все было в порядке массива, вам нужно использовать массив. Позвольте мне спросить вас, что такое «первый» элемент в документе? Ясно, что это глупый вопрос, но это доказывает. Объекты не поддерживают порядок, это то, что делают массивы.

Так что используйте массив для этого. Квадратные скобки обозначают массив, который не принимает строку в качестве ключа (это то, что делают объекты). Чтобы сделать вещи более запутанными, массивы являются объектами, поэтому они могут действовать как объекты - не путайте это и считайте объекты массивами.

+0

Незначительный каламбур, но на самом деле это не «JSON», это объект буквальный. –

+0

JSON - просто подмножество объектного литерала JS, в основном, никаких функций, и вы должны указывать имена свойств. Таким образом, вышеизложенное относится к JSON в моей книге. @JamesMontagne: вы рассматриваете его только как JSON, если это строка? –

+0

@juan Да. Это формат обмена данными. В этом случае это просто литерал объекта. Мог бы просто быть мной. Это моя (может быть) строгая интерпретация «JSON - текстовый формат, полностью независимый от языка» –

0

Вы можете использовать Object.keys() в браузерах, которые поддерживают его:

console.log("first remaining property is " + Object.keys(myObject)[0]); 

Хотя я уверен, если заказ гарантируется либо подхода.

+0

Я не понимаю, о чем спрашивает ОП, или на что этот ответ пытается ответить: p –

+0

Как я понимаю, он хочет знать, есть ли лучший способ получить «первое» свойство своего объекта. –

+0

Заказ никогда не гарантируется объектами; порядок - это свойство массивов. – Incognito

1
myObject["123"] = { "C": 123, "D": 456 }; 

делает не добавить больше элементов к объекта (ассоциативный массив), он заменяет их; чтобы добавить элементы, которые вы должны были бы написать:

myObject["123"].C =123; 
myObject["123"].D = 456; 

Что касается # 2 и # 3, объекты Javascript не гарантируют возврата свойств в том порядке, в котором они были добавлены; для этого вам придется прибегнуть к массиву, а затем после корректировки данных в стриктуры различной структуры данных, вы можете получить первый элемент с:

myArray.shift() 
Смежные вопросы