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

我想迭代简单的JSON数组,但它总是返回数组的长度是未定义的

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 

我认为它把长度关键字看作是一个像{“length”:40}这样的json数组键。

我已经尝试了Object.keys(chatmessage).length,但它返回总数键值( 2 ),但我只有一个logging。

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

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

那里有两个问题:

  1. 这不是JSON。 JSON是数据交换的文本符号 。 如果您正在处理JavaScript源代码,而不是处理string ,那么您并没有处理JSON。 这是一个JavaScript对象初始值设定项。

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

对象没有length属性。 如果你想让你的chatmessage说出它有多less属性,你将不得不明确地添加第三个属性(这引发了值是2还是3的问题:-))。 或者,也可以使用“key”和“value”属性来创build一个对象数组,但这样做会很麻烦。

如果需要,可以通过几种方法确定对象具有多less个属性:

  1. Object.keys(obj).length会告诉你这个对象有多less个自己可枚举的属性(如果你使用的是ES2015,忽略任何Symbol名称)。 该数字将不包含任何inheritance的属性或任何非可枚举的属性。 在你的例子中的答案是2。

  2. Object.getOwnPropertyNames(obj).length)会告诉你有多less自己的属性的对象,无论它们是否可枚举(但又忽略任何Symbol名称)。 该数字将不包含任何inheritance的属性或任何非可枚举的属性。 你的例子中的答案将再次为2,因为你的对象没有非枚举属性。

我已经尝试了Object.keys(chatmessage).length但它返回总数键值(2),但我只有一个logging。

正如我上面所说的, Object.keys会告诉你这个对象有多less个可以枚举的属性 。 如果你想知道有多less物体 ,答案是1。

如果你的目标是发送一系列的聊天消息,那么你想创build这样的:

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

这个定义了一个条目的数组:一个表示聊天消息的对象。 多个将被分隔,

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

请注意,如果你这样做,你的动词可能应该是listmessages (复数),而不是listmessage 。 (如果你的母语处理与英语不同的复数forms,我会提到这一点;有很多不同的方法在这个星球上用不同的人类语言处理复数forms。:-))