Javascript объект / массив населения вопрос - PullRequest
1 голос
/ 18 января 2011

Есть ли разница между:

 var samples = {
        "TB10152254-001": {
            folderno: "TB10152254",
            ordno: "001",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        },
        "TB10152254-002": {
            folderno: "TB10152254",
            ordno: "002",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        },

        "TB10152254-003": {
            folderno: "TB10152254",
            ordno: "003",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        }
    };

И

 var samples = new Array();
samples["TB10152254-001"]  = {
            folderno: "TB10152254",
            ordno: "001",
            startfootage: "",
            endfootage: "",
            tagout: "Y"};

samples["TB10152254-002"] = {
            folderno: "TB10152254",
            ordno: "002",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        };

samples["TB10152254-003"] =  {
            folderno: "TB10152254",
            ordno: "003",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        };

РЕДАКТИРОВАТЬ:

Я перефразирую вопрос: Как мне заполнить хэшдинамически?Я не могу сделать что-то вроде samples.TB10152254-003, потому что я TB10152254-003 является динамическим ... так, это вообще возможно?

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Оба будут работать, потому что массив - это тип объекта. Но использование Array таким способом не дает никаких преимуществ и может легко создать проблемы, когда вы перебираете свойства, используя for/in.

Объект будет подходящим типом для именованных свойств. Зарезервируйте использование массива только для свойств индекса.


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

   // Create a new empty object. You an use "new Object()" if you wish
var samples = {};

  // Populate the "samples" object in the same way you would an Array.
samples["TB10152254-001"]  = {
            folderno: "TB10152254",
            ordno: "001",
            startfootage: "",
            endfootage: "",
            tagout: "Y"};

samples["TB10152254-002"] = {
            folderno: "TB10152254",
            ordno: "002",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        };

samples["TB10152254-003"] =  {
            folderno: "TB10152254",
            ordno: "003",
            startfootage: "",
            endfootage: "",
            tagout: "Y"
        };
1 голос
/ 18 января 2011

Да. Во втором примере вы «злоупотребляете» тем фактом, что Array также является Object. Не делай этого.

Используйте Array s только для числовых индексированных значений и обычное Objects для своего рода хеш-таблиц.

Предлагаю прочитать подробнее о Array с и Object с .

В JavaScript в основном все является объектом. Также массивы. Но объект Array предоставляет дополнительные методы для работы с числовыми индексированными данными.

Вероятно, вы сможете лучше увидеть разницу, если наберете samples.length во втором примере. Простой объект не имеет свойства length, как у массива. Для массива он сообщает вам количество элементов, хранящихся в массиве. Теперь, когда вы вызовете samples.length во втором примере, вы получите 0, потому что массив фактически не содержит элементов.

Что может привести к еще большей путанице, так это то, что у вас есть две возможности доступа к свойствам объекта: «Точечная нотация», object.property и «Массивная нотация», object['property']. Но это функциональность объектов, а не массивов.

Нотация массива оказывается полезной, когда вы генерируете ключи или сохраняете имя свойства в переменной.

Обновление:

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

var samples = {};

for(var i = 0; i < 4; i++) {
    samples["TB10152254-" + i] = {
        folderno: "TB10152254",
        ordno: i,
        startfootage: "",
        endfootage: "",
        tagout: "Y"
    }
}

Если вы хотите получить доступ к свойствам, вы должны использовать цикл for...in для перебора ключей:

for(var key in samples) {
    var value = samples[key];
}

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

...