В javascript, когда использовать литерал объекта и когда использовать массив?

Вот пример. Меня беспокоит то, что оба справляются со своей задачей. какой из них предпочесть?

var fooArr = [{ "bar": {"blah": 9 } }];

for(var i in fooArr) {
    var value = fooArr[i].bar.blah;
console.log(value); //checking in firebug console
}

var fooObj = { "bar": {"blah": 9 } };
for(var i in fooObj) {
    var value = fooObj[i].blah;
console.log(value); //checking in firebug console
}

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

var fooObj1 = {
    { "bar": { "blah": 9 } },
    { "bar": { "blah": 4 } },
    { "bar": { "blah":12} }
};

Поэтому мне пришлось изменить приведенный выше код на что-то вроде ниже, которое работает. Это слишком плохо, чтобы быть слишком липким с литералами Object

var fooObj1 = {
    1:{ "bar": { "blah": 9 } },
    2:{ "bar": { "blah": 4 } },
    3:{ "bar": { "blah":12} }
};

Еще раз и заранее спасибо тем, кто поможет мне с запросом.


person Abhijit    schedule 19.01.2011    source источник
comment
Я связал это с существующим вопросом, который частично отвечает на мой запрос. ... Объект JavaScript просто не имеет свойства длины, только массивы. Если вы хотите узнать количество свойств, определенных для объекта, вам нужно перебрать их и подсчитать... stackoverflow.com/questions/4690520/   -  person Abhijit    schedule 19.01.2011
comment
Почему вы избегаете записи массива? Похоже, вам нужен список объектов. Объект — это просто набор пар имя/значение. Во втором примере у вас есть 3 набора объектов без имен, по которым можно было бы на них ссылаться.   -  person Erik Reppen    schedule 19.01.2011


Ответы (5)


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

Используйте объект, когда вам нужно обратиться к чему-то по имени.

var obj = {}

//3 способа сделать одно и то же:

var obj.newName = 'bob';

var obj['newName'] = 'bob';

var name = 'newName';
var obj[name] = 'bob';

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

var obj = { newName:'bob' }

Если вам нужна куча имен в объекте, это будет немного глупо:

var obj = { newName:'bob', anotherNewName:'sue', yetAnotherNewName:'billy' }

obj.newName === 'bob'
obj.anotherNewName === 'sue'
//etc...

Вот для чего нужны массивы.

var listOfNewNames = ['bob','sue','billy']
listOfNewNames[0] === 'bob'
listOfNewNames[1] === 'sue'
//etc...

Конечно, ничто не мешает вам присвоить массив свойству объекта:

obj { listOfNewNames:['bob','sue','billy'] }

obj.listOfNewNames[0] === 'bob'

Или, как показано выше, несколько объектов в массиве:

var listOfMonsters = [
    { monsterName:'Grarrr',eats:'people' },
    { monsterName:'Wadsworth',eats:'other monsters'}
];

listOfMonsters[1].monsterName === 'Wadsworth'

Объекты, как правило, больше связаны с объединением групп связанных значений и методов для удобства ссылок. Массивы — это просто список вещей, которые обычно можно считать применимыми или производными от одной и той же вещи.

person Erik Reppen    schedule 19.01.2011

Цикл for .. in перебирает перечисляемые. Вы можете прочитать об этом. .

Если у вас есть массив объектов, я бы предложил традиционный цикл for:

var fooObjs = [ {bar: "blah"}, {bar: "blah2"} ];
for (var i = 0, j = fooObj.length; i < j; i++) {
  console.log(fooObjs[i].bar);
}

Если у вас есть объект с несколькими свойствами, вы можете использовать цикл for .. in:

var fooObj = { bar: "blah", baz: "blah2" };
for (var i in fooObj) {
  if (fooObj.hasOwnProperty(i)) { // So you don't log prototype properties
    console.log(fooObj[i]);
  }
}
person James Sumners    schedule 19.01.2011

Используйте массив, когда вы знаете, что у вас будет более одного объекта. Массив из одного элемента не нужен, если будет использоваться только один объект.

Как видите, синтаксис также немного сложнее (у вас есть [...] и bar при использовании массивов -> используется больше символов), поэтому не используйте его, если вам это не нужно.

person darioo    schedule 19.01.2011

Используйте массив, если вам нужны списки, и используйте объекты, если вам нужны свойства.

В приведенном выше случае я бы предпочел последний.

Кроме того, никогда не используйте for in для массива (это чрезвычайно медленно и побеждает цели) и всегда используйте hasOwnProperty при переборе свойств объекта.

person Ivo Wetzel    schedule 19.01.2011
comment
ага, было приятно узнать о производительности for in. Спасибо. - person Abhijit; 19.01.2011

Вы используете массив, когда вам нужно использовать более одного элемента. Пример:

var fooArr = [{ bar: { blah: 9 } },{ bar: { blah: 4 } },{ bar: { blah: 12 } }];
for(var i in fooArr) {
  var value = fooArr[i].bar.blah;
  console.log(value); // will log "9", "4" and "12"
}

Во втором примере у вас есть только один объект, поэтому вам вообще не нужен цикл для доступа к свойству:

var fooObj = { bar: { blah: 9 } };
var value = fooObj.bar.blah;
console.log(value);
person Guffa    schedule 19.01.2011