2014-01-06 1 views
0

Я задал этот вопрос раньше (см. how to define a module pattern for an array of products with products properties?) и полагал, что получил правильный ответ. Но мне было немного раньше, чтобы одобрить это предложение; когда я тестировал немного больше (с jsfiddle) предложенное решение не работает unfortenately для всех элементов массива, см упрощенного примера ниже:Как определить шаблон модуля для массива продуктов с свойствами продуктов (часть 2)?

var products = [{name:'', price:'', type:''}]; //solution given 

//this works, e.g. for first array element 
products[0].name = 'aname'; 
alert(products[0].name); 

// this does not work, e.g. for following array elements 
products[1].name = 'aname'; 
alert(products[1].name); //no response in jsfiddle 

Моего вопрос снова: как определить до элегантной структуры с результирующим выходом таким как: [{имя: «Volvo», цена: «67000», тип: «автоматический»}, {имя: «Мерседес», цена: «77000», ty pe: «manual»}];

Обратите внимание, что количество элементов массива может меняться. Также отметим, что решение, как показано ниже будет работать, но это полезно только тогда, когда количество элементов массива, как известно, при определении, что не так в моей ситуации ...

var products = [{name:'', price:'', type:''},{name:'', price:'', type:''}]; //solution will work for 2 array elements 

ответ

0

Это потому, что при попытке доступа products[1] еще не был создан. Так что это «неопределенный». Я создал функцию, которая проверяет, есть ли значение для данного ключа, и создает значение по умолчанию, если его нет. Затем вы получаете доступ к вашему массиву с помощью функции. Это всего лишь один из нескольких вариантов, которые вы имеете для значений «автоматического создания» массива при доступе:

var products = []; 

function getProduct(x){ 
    // Check if array key exists. If not, create it 
    if(typeof products[x] === "undefined") 
     products[x] = {name:'', price:'', type:''}; 
    return products[x]; 
} 


getProduct(0).name = 'aname'; 
alert(getProduct(0).name); 

getProduct(1).name = 'aname2'; 
alert(getProduct(1).name); 
+0

ok, thnx. очень полезно – Joppo

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