Как добавить пары ключ / значение в глобальную переменную в JQuery? - PullRequest
3 голосов
/ 10 января 2011

У меня есть программа, которая добавляет кучу Div на страницу.У меня есть куча дополнительных атрибутов 'data-', добавленных в div, которые я позже хочу включить в глобальную переменную.

Я в основном хочу настроить что-то вроде этого:* но я получаю сообщение об ошибке TypeError: Cannot set property 'label' of undefined

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

Ответы [ 3 ]

1 голос
/ 10 января 2011

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

$.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 голосов
/ 11 января 2011

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

// 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
0 голосов
/ 10 января 2011

Кажется, $.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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...