Javascript/jQuery未定义的对象长度
我有一个从数据库调用创建的对象,其格式如下:Javascript/jQuery未定义的对象长度,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,我有一个从数据库调用创建的对象,其格式如下: Object { group1={...}, same=null, group2=null} 我正在尝试获取组1、组2和相同组中的项目数 我通过控制台访问它,如下所示: dataObj.group1.length 在上图中,这返回未定义。但是,如果我在group1中有多个项目,它返回的计数很好。仅当对象/数组中有单个项时,它才会导致问题 是否有一个函数可用于说明这些可能性并返回上述对象中项目的长度 更新: 这就是我创建数据的方式: succ
Object { group1={...}, same=null, group2=null}
我正在尝试获取组1、组2和相同组中的项目数
我通过控制台访问它,如下所示:
dataObj.group1.length
在上图中,这返回未定义。但是,如果我在group1
中有多个项目,它返回的计数很好。仅当对象/数组中有单个项时,它才会导致问题
是否有一个函数可用于说明这些可能性并返回上述对象中项目的长度
更新:
这就是我创建数据的方式:
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();
}
从这里,我试图获得相同的,组1
,组2
中的项目数量
这是响应中有多个项的示例。我可以使用dataObj.group1.length
访问它,它返回正确的2
。当只有1
结果时,我只是想弄明白他如何处理这个问题。
在我的头变成一块木头后,正确地向我解释了这个问题,这只是一个掩盖不测事件的简单例子。正如@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。如果它是null,它将返回0;如果它是数组,它将返回实际长度。我被这个问题弄糊涂了。您正在寻找一种方法来计算对象中属性的数量吗?对象没有长度,因此无论group1有多少属性,1或其他属性,您都应该得到未定义的
。@Archer为什么在group1中有两个项而不是一个项时,这种方法会起作用?您的api返回的数据不一致。要么在api端修复它,要么在尝试获取长度之前,必须首先测试该组是否包含数组或对象。如果没有,是否为空?谁知道呢,这是不一致的。对不起,这很不清楚。对象没有长度属性。您在@Tushar的回答中告诉他(现在已删除),group1的长度应该为1,但上面的图片显示的属性不止1个。你需要更好地解释,或者解释为什么你需要这个,因为这个问题不清楚。很抱歉,在我最初的问题中非常混乱和模糊。开会前,我在争分夺秒,没想到我把时间留给了猜测。我在您的示例中使用了建议的函数,直到我能够改变响应的结构。它工作得很好,我感谢你的时间和良好的书面答复。我会确保从一开始就写出更好的问题。不用担心。这是我的错误,我无法以任何其他方式阅读问题,直到它最终点击。很高兴我们能帮上忙:)