Преобразование массива в объект?

У меня есть массив, который содержит несколько объектов:

  var getUsers = function (){
    allUsers = [];

    $().SPServices({
      operation: "GetUserCollectionFromSite",
      completefunc: function(xData, Status){
        var responseXML = $(xData.responseXML);
        responseXML.find("User").each(function(){
          allUsers.push({
            id: $(this).attr("ID"),
            name: $(this).attr("Name"),
            domain: $(this).attr("LoginName"),
            email: $(this).attr("Email"),
            isAdmin: $(this).attr("IsSiteAdmin")
          });
        });
      }
    });
    return allUsers;
  }

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

Это то, что я пробовал, но по какой-то причине мое приложение останавливается.

var getUsers = function (){
      allUsers = {};

    $().SPServices({
      operation: "GetUserCollectionFromSite",
      completefunc: function(xData, Status){
        var responseXML = $(xData.responseXML);
        responseXML.find("User").each(function(){
            //This is pretty much where I'm at a lost
          allUsers[$(this).attr("ID")]:{
            name: $(this).attr("Name"),
            domain: $(this).attr("LoginName"),
            email: $(this).attr("Email"),
            isAdmin: $(this).attr("IsSiteAdmin")
          };
        });
      }
    });
    return allUsers;
  } 

Я пытаюсь получить объект, который структурирован следующим образом:

var allUsers = {
    "68": {
        id: 68,
        name: 'mike',
        domain: 'i: 0#.f | admembers | mike.ca',
        email: 'mike.ca',
        isAdmin: false
    }
};

PS: извините за плохой заголовок.


person Batman    schedule 29.01.2014    source источник


Ответы (2)


У вас тут опечатка:

allUsers[$(this).attr("ID")] : {
                             ^

: должно быть =, так как это назначение клавиши.

allUsers[$(this).attr("ID")] = {

Все остальное выглядит нормально. За исключением того, что вы можете назначить $(this) переменной, чтобы избавить вас от поиска DOM.

var self = $(this);
person Jivings    schedule 29.01.2014
comment
Работает, спасибо. Я попытался установить var self вне функции, в моей службе, но по какой-то причине это не сработало. Кроме этого, кажется, работает нормально. - person Batman; 29.01.2014
comment
Да, это то, что я заметил. Я специально старался не помещать его туда, чтобы ему не приходилось объявлять его так часто, но я думаю, что иначе это не сработает. - person Batman; 29.01.2014
comment
@Batman Это потому, что this должен ссылаться на элемент, который повторяется, что является областью действия этой функции. - person Jivings; 29.01.2014

Просто замените : на = в строке allUsers[$(this).attr("ID")] : {

  allUsers[$(this).attr("ID")] = {
    id: $(this).attr("ID"),
    name: $(this).attr("Name"),
    domain: $(this).attr("LoginName"),
    email: $(this).attr("Email"),
    isAdmin: $(this).attr("IsSiteAdmin")
  };
person Satpal    schedule 29.01.2014
comment
this.id вместо $(this).attr('ID') может быть лучше? - person qwertynl; 29.01.2014
comment
@qwertnl узнает ли он, что ищет атрибут id из текущего узла xml? - person Batman; 29.01.2014