2016-08-01 8 views
-3

У меня есть объект который создается из вызова базы данных в следующем формате:Javascript/JQuery неопределенный объект длина

Object { group1={...}, same=null, group2=null} 

enter image description here

Я пытаюсь получить количество элементов в group1, group2 и тому же.

я к нему доступ через консоль, так как:

dataObj.group1.length 

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

Есть ли функция, которая может использоваться для учета этих возможностей и возвращает length элементов в этих объектах выше?

Update:

Это, как я создаю мои данные:

success: function(data) { 

     // Define our data response 
     var d = data.data; 

     // Push our data to an object 
     dataObj = { 
      same: (d.same ? d.same.tools : null), 
      group1: (d.group1 ? d.group1.tools : null), 
      group2: (d.group2 ? d.group2.tools : null) 
     } 

     // Render our table 
     renderCompare(); 
    } 

Отсюда, я пытаюсь получить количество элементов в same, group1, group2.

Это пример того, когда в ответе содержится более одного элемента. Я могу получить доступ к этому, используя dataObj.group1.length, и он возвращает 2, что является правильным. Все, что я пытаюсь понять, как справиться с этим, когда есть только результат 1. enter image description here

+0

Я смущен вопросом. Вы ищете способ подсчета количества свойств объекта? – stackoverfloweth

+1

Объекты не имеют длины, поэтому вы должны получить 'undefined', независимо от того, сколько свойств group1 имеет 1 или иначе. – Archer

+0

@Archer, почему это будет работать, когда в группе 1 есть два элемента, а затем один элемент? – SBB

ответ

2

После правильного объяснения вопроса после того, как моя голова превратилась в кусок дерева, это просто случай покрытия возможных ситуаций. Поскольку @KevinB правильно заявляет, вы должны действительно дезинфицировать данные ответа, чтобы он всегда возвращал массив объектов, даже если в нем есть только один объект или даже нет объектов. Это то, что вызывает вашу проблему.

Если вы получите этот ответ ...

{ 
    group1: { tool: 244, toolName: "blueprint" }, 
    group2: null, 
    same: null 
} 

затем group1 является объектом, а не массив, поэтому, следовательно, не имеет никакого length собственности. Однако, если вы получили этот ответ вместо ...

{ 
    group1: [{ tool: 244, toolName: "blueprint" }], 
    group2: null, 
    same: null 
} 

тогда group1 будет держать точно те же данные, но будет массив и, следовательно, имеет свойство length.

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

function getLength(obj) { 
    if (obj == null) return 0; 
    if (obj.length == undefined) return 1; 
    return obj.length; 
} 

В вашем примере, вы бы использовали getLength(dataObj.group1) и вернется 1. Было бы return 0, если это было null и вернуть фактическую длину, если бы это был массив.

+0

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

+2

Не беспокойтесь. Это была моя ошибка, и я не мог прочитать вопрос любым другим способом, пока он наконец не щелкнул. Рад, что мы могли бы помочь :) – Archer

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