2011-01-10 3 views
3

У меня есть программа, которая добавляет кучу Div на страницу. У меня есть куча дополнительных атрибутов «данные», добавленных в div, которые я позже хочу включить в глобальную переменную.Как добавить пары ключ/значение в глобальную переменную в JQuery?

Я в принципе хочу, чтобы создать что-то вроде этого:

$.scoreArray = { 
    scores: [], 
    labels: [] 
}; 
$(".word").each(function (i) { 
    $.scoreArray.labels.label = $(this).attr("data-label"); 
    $.scoreArray.labels.x = $(this).attr("data-x"); 
} 
... 

, но я получаю ошибку TypeError: Cannot set property 'label' of undefined

Я попытался положить .label и .x, как [ «ярлыком»] и [ «x»], но безрезультатно. Что я делаю не так?

+1

Что вы пытаетесь сделать - создать массив объектов scoreArray.labels с одной записью для каждого слова? Или вы хотите сохранить последнее слово, найденное в одном объекте ярлыков? Если вы делаете метки '{}' not '[]', тогда он должен работать, но может и не быть тем, чего вы пытаетесь достичь. – Rup

ответ

1

Отредактировано: Я думаю, что я вижу, что вы хотите сделать. Вы хотите, чтобы массивы содержали кучу объектов, по одному для каждого слова, которые содержат атрибуты, которые вы собираете. Итак, вы хотите что-то вроде:

$.scoreArray = { 
    scores: [], 
    labels: [] 
}; 
$(".word").each(function (i) { 
    newLabel = {}; 
    newLabel.label = $(this).attr("data-label"); 
    newLabel.x = $(this).attr("data-x"); 
    $.scoreArray.labels.push(newLabel); 
} 

Однако ошибка вы видите звуки, как «глобальный» переменной, созданной не был найден в рамках которой вы находитесь Является ли это ваш реальный код.?

+0

Я думаю, что OP * делает * хочет массивы, но хочет вставлять в них объекты. – sberry

+0

Это не будет источником ошибки OP. Javascript не будет жаловаться при добавлении именованных свойств в массив. – user113716

+0

Да, вы оба правы. Отредактировано с учетом ваших комментариев. –

0

Похоже, $.scoreArray.labels: undefined при попытке получить к нему доступ.

Убедитесь, что определено до, которое вы пытаетесь добавить к нему.

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

Если вы хотите массив объектов, выполните следующие действия:

$.scoreArray = { 
    scores: [], 
    labels: [] 
}; 
$(".word").each(function (i) { 
    $.scoreArray.labels[ i ] = {}; 
    $.scoreArray.labels[ i ].label = $(this).attr("data-label"); 
    $.scoreArray.labels[ i ].x = $(this).attr("data-x"); 
} 

или это:

$.scoreArray = { 
    scores: [], 
    labels: [] 
}; 
$(".word").each(function (i) { 
    $.scoreArray.labels[ i ] = {label: $(this).attr("data-label"), 
            x: $(this).attr("data-lx") 
           }; 
} 

или, возможно, даже лучшим решением было бы использовать .map(). Это (и другие решения) предполагают, что вы не добавляете к существующему массиву.

$.scoreArray.labels = $(".word").map(function (i) { 
    return {label: $(this).attr("data-label"), 
       x: $(this).attr("data-lx") 
      }; 
}).get(); 
0

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

// are you sure you want to add this as a property on the jQuery object? 
var $.scoreArray = $.map($('.word') , function(elem) { 
         var self = $(elem); 
         return { score : self.attr("data-x"), 
           label : self.attr("data-label") }; 
        }); 

// $.scoreArray will be an array of objects, each with a score and label property 
Смежные вопросы