Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我无法计算物体的长度_Javascript_Ajax_Json - Fatal编程技术网

Javascript 我无法计算物体的长度

Javascript 我无法计算物体的长度,javascript,ajax,json,Javascript,Ajax,Json,在一个ajax调用中,我检索一个JSON对象,并通过长度属性计算结果的数量。但在另一段代码中,通过相同的调用和对服务器端脚本的少量修改,长度属性始终未定义。为什么? 请注意,在开发人员控制台中,msg被视为一个对象,由ajax自动从JSON转换而来,而不是这样的数组 $.ajax({ url : 'richiediListaVideo.php', type : 'POST', data : data, dataType : 'json', success : functio

在一个ajax调用中,我检索一个JSON对象,并通过长度属性计算结果的数量。但在另一段代码中,通过相同的调用和对服务器端脚本的少量修改,长度属性始终未定义。为什么? 请注意,在开发人员控制台中,msg被视为一个对象,由ajax自动从JSON转换而来,而不是这样的数组

$.ajax({
  url : 'richiediListaVideo.php',
  type : 'POST',
  data :  data,
  dataType : 'json',
  success : function (msg) 
            {
              alert(msg['videos'].length)


            },
未定义长度类似于的对象

-video
--title
--duration
---tags
---8  "funny"
---1352  "animals"
---13    "Tv"
我的目标是检索标签的长度,我编写了msg['video']['tags'].length

这是msg的字符串化版本

{视频:{持续时间:5:51,视图:2650,视频id:512498,分级:5.00,分级:5,标题:可爱的狗,发布日期:2013-08-05 16:50:08,标签:{8:搞笑,54:lol,75:Animals,89:Garden}}

澄清: 无论如何,我知道如何计算标签的数量,但关键是我真的想知道为什么会发生这种情况

无论如何,我知道如何计算标签的数量

var length=0; 
for(var elemy in res['video']['tags']) length++
但关键是我真的想知道为什么会发生这种情况

无论如何,我知道如何计算标签的数量

var length=0; 
for(var elemy in res['video']['tags']) length++
但关键是我真的想知道为什么会发生这种情况

发生这种情况的原因是因为res['video']['tags']是用大括号{…}定义的对象,因此它不具有长度属性,因为它不是正确的数组。正确的数组定义它们的一种方法是使用方括号[],因为它们确实具有长度属性

注意:未按整数索引的命名属性不作为数组长度的一部分计算,但也可以添加到数组中。反之亦然,编号的属性可以添加到对象。

这是您的结果:

{"tags":{"8":"funny", "54":"lol","75":"Animals","89":"Garden"}}
这就是为什么您不能使用.length。 如果你有这样的东西:


然后.length将在res['tags'].length上起作用。

console.logJSON.stringifymsg显示的内容?除非您的msg['videos']是数组/集合或字符串,否则它不会有任何长度。您的msg['videos']包含什么内容?我们无法知道为什么返回未定义的信息。您应该进行一些调试,并附带更多功能:视频呢?它看起来像什么?如果它不是数组或字符串,则只有显式创建/设置.length属性时,它才会有.length属性。请显示实际的JSON内容,或console.log显示的msg对象。因此,解释可能是标记是一个关联数组,无法计数?是的,这是正确的。关联数组通常不计数,因为标识符通常不是数字。元素介于0和499之间的数组的长度为500;这是显而易见的。但是,具有document和alert等元素的对象并没有长度,只是一个非编号字段的集合。但是你仍然可以通过像你在自己的答案中建议的那样做一个循环来计算这些非编号字段中有多少个。绝对不是因为约瑟夫·迈尔斯(Joseph Myers)说过,只有以数字作为索引的数组才能被计数。。在这种情况下,数字是字符串,结果总是未定义的,我刚刚做了一些工作proofs@A.S.Roma您所做的只是将对象分解为单独的、不相关的对象,并在所有对象周围使用大括号。这证明不了什么,也于事无补。事实上,它破坏了数据的有用性,因为现在标签将被一个无意义的索引而不是原始代码访问。@JosephMyers这不是我所做的…这不是我回答的目的…请仔细阅读。我提到,除非在我的示例中有一个与实际对象类似的东西可以应用长度,否则不能使用javascript长度。如果你注意OP的问题,特别提到他/她知道如何计算你在回答中提供的方式。OP关心的是.length属性。我确实仔细阅读了,我理解你所说的。因此,我没有投票否决你的答案。然而,奇怪的是你的答案被接受了,因为OP说了两遍,他唯一的问题是为什么会发生。我已经解释了为什么会这样。我的回答也包含了你关于数组的观点,即,。只有数组(例如使用方括号定义的数组)具有长度属性,该属性统计除命名属性之外的所有内容。我相信你给了OP一个错误的印象,当你完全改变了数据结构时,你正在神秘地使它工作。但是不用担心!你很聪明,也理解这个问题,我可能不该发表评论。我理解你,但我只是担心OP可能会误解你。
var res = 
{ "tags": [
     {"8":"funny"}, 
     {"54":"lol"},
     {"75":"Animals"},
     {"89":"Garden"}
]}