Как хранить объекты в массиве с помощью javascript

Я разрабатываю расширения для браузера Safari. я хочу сохранить текущие активные объекты вкладки в массиве в качестве ключа. как хранить несколько объектов вкладок в массиве.

я написал следующий код.

**Первый сценарий:

var obj = {};

obj1=new Object();
obj2=new Object();
obj3=new Object();

obj['cTab_'+obj1] = "This is object1";
obj['cTab_'+obj2] = "This is object2";
obj['cTab_'+obj3] = "This is object3";**

проблема в том, что я получаю значение третьего объекта. как получить все значения объекта.

**Второй сценарий:

var arr = new Array();

cTabObj1 = new Object();
arr[cTabObj1] = 'This is cTabObj1 Value';

cTabObj2 = new Object();
arr[cTabObj2] = 'This is cTabObj2 Value';

cTabObj3 = new Object();
arr[cTabObj3] = 'This is cTabObj3 Value';

alert("arr[cTabObj1]    :" + arr[cTabObj1] + " arr[cTabObj2]    :" + arr[cTabObj2] + " arr[cTabObj3]    :" + arr[cTabObj3]);**

Здесь также я получаю "Это значение cTabObj3" для всех трех объектов

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


person Ramesh    schedule 01.08.2011    source источник
comment
Первая проблема возникает из-за того, что все объекты будут иметь одинаковое строковое представление. Однако мое первоначальное предложение было бы вашим вторым сценарием; поскольку это не работает, это становится интересной проблемой.   -  person jtbandes    schedule 01.08.2011
comment
Повторяющийся вопрос, см. stackoverflow.com/questions/6896567/   -  person Mörre    schedule 02.08.2011


Ответы (4)


я хочу сохранить текущие активные объекты вкладки в массиве в качестве ключа

Вы не можете этого сделать. Ключи — это строки. Они всегда являются строками.

Если вы посмотрите на массив, вы обнаружите, что любой объект преобразуется в "[object Object]", поэтому вы в основном вставляете один и тот же ключ 3 раза.

Используйте console.log(arr) или console.dir(arr) вместе с firebug или chrome/opera/safari

Что вам нужно, так это ES6 WeakMap.

Только Firefox6 реализует WeakMap.

person Raynos    schedule 01.08.2011
comment
См. stackoverflow.com/questions/6896567/ - person Mörre; 02.08.2011
comment
@Morre определение собственного toString для объектов - хитрый трюк. Не думал об этом - person Raynos; 02.08.2011
comment
Я ВСЕГДА делаю это (toString) для ВСЕХ объектов в любом случае - очень хорошо для отладки, гораздо лучше выводится в Firebug ;-) - person Mörre; 02.08.2011

Ключи должны быть строками.

Попробуйте реализовать метод toString для своих объектов, чтобы он возвращал уникальный идентификатор для каждого объекта. Тогда 'cTab_' + obj будет уникальной строкой.

person sje397    schedule 01.08.2011

Вам лучше хранить вот так

cTabObj1 = new Object();
arr["cTabObj1"] = cTabObj1;
person hungryMind    schedule 01.08.2011

Ваш первый сценарий - это путь, за исключением того, что вы назначили один и тот же ключ нижнего индекса для каждого объекта, который вы сохраняете в obj. Когда вы используете что-либо кроме строки для ключа свойства объекта, значение вызывается toString() внутренне, поэтому

obj['cTab_'+obj1] = "This is object1";
obj['cTab_'+obj2] = "This is object2";
obj['cTab_'+obj3] = "This is object3";

все будут иметь один и тот же ключ cTab_[object Object].

Что вам нужно, так это различать ключи. Поскольку каждый объект будет возвращать «[object Object]» при вызове toString(), вы также можете удалить объект из ключа свойства, поскольку он является избыточным, например.

var obj = {};
obj['cTab1'] = "This is object1";
obj['cTab2'] = "This is object2";
obj['cTab3'] = "This is object3";

или короче

var obj = {
    cTab1 : "This is object1",
    cTab2 : "This is object2",
    cTab3 : "This is object3"
};

Причина, по которой второй путь не подходит, заключается в том, что вы пытаются использовать массив JavaScript как ассоциативный массив, чем они не являются; Сначала может показаться, что это работает, но затем вы обнаружите очень странное поведение, например, arr.length не считает их элементами в массиве и т. д. Для получения более подробной информации прочитайте связанную статью. Вы хотите использовать для этого Object ({}).

person Russ Cam    schedule 01.08.2011