Json长度在节点js中始终未定义

时间:2016-06-06 08:06:47

标签: javascript json node.js

我正在尝试迭代简单的json数组,但它总是返回数组的长度为 undefined

var chatmessage = {};
...................
...................
socket.on('listmessage', function(mesg){ 
chatmessage={"message":"Hello", "to":"sjdfjhsdf"};
});

socket.on('private', function(mesg){ 
console.log(chatmessage.length+' - '+chatmessage.message +' - '+ chatmessage.to);
}); 

当私人事件获得触发时,它返回

undefined - Hello - sjdfjhsdf

我认为它将长度关键字视为json数组键,如 {“length”:40}

我尝试了 Object.keys(chatmessage).length ,但它返回了总数键值( 2 ),但我只有一条记录。

在节点js中迭代json的正确方法是什么

1 个答案:

答案 0 :(得分:4)

  

我正在尝试迭代简单的json数组

那里有两个问题:

  1. 那不是JSON。 JSON是用于数据交换的文本符号。如果您正在处理JavaScript源代码,而不是处理字符串,那么您就不会处理JSON。它是一个JavaScript对象初始化程序。

  2. 它没有定义数组,它定义了一个对象

  3. 对象没有length属性。如果您希望chatmessage说明它有多少属性,您必须明确添加第三个属性(然后提出值应该是2还是3 :-)的问题)。或者,您可以使用" key"将其设为一个对象数组;和"价值"属性,但这将很难处理。

    如果需要,您可以通过以下几种方式确定对象有多少属性:

    1. Object.keys(obj).length会告诉您对象具有多少拥有的,可枚举的属性(如果您正在使用ES2015,则忽略任何Symbol个名称) 。该数字不包括任何继承的属性或任何不可枚举的属性。你的例子中的答案是2。

    2. Object.getOwnPropertyNames(obj).length)会告诉您该对象有多少拥有的属性,无论它们是否可枚举(但再次忽略任何Symbol个名称)。该数字不包括任何继承的属性或任何不可枚举的属性。您的示例中的答案将再次为2,因为您的对象没有不可枚举的属性。

    3.   

      我尝试了Object.keys(chatmessage).length,但它返回了总数键值(2),但我只有一条记录。

      如上所述,Object.keys会告诉您对象拥有多少个可枚举的属性。如果您要查找有多少对象,答案是1。

      如果你的目标是发送数组的聊天消息,那么你想要像这样创建:

      var chatmessages = [
          {"message":"Hello", "to":"sjdfjhsdf"}
      ];
      

      它定义了一个带有一个条目的数组:一个表示聊天消息的对象。多个将使用,分隔:

      var chatmessages = [
          {"message":"Hello", "to":"sjdfjhsdf"},         // First message
          {"message":"Hello again", "to":"sjdfjhsdf"}    // Second message
      ];
      

      请注意,如果你这样做,你的动词应该是listmessages(复数),而不是listmessage。 (我提到这个,以防你的母语处理复数与英语不同;有一个很多不同的方式复数在地球上的各种人类语言中处理。:-))