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数组
那里有两个问题:
-
这不是JSON。 JSON是数据交换的文本符号 。 如果您正在处理JavaScript源代码,而不是处理string ,那么您并没有处理JSON。 这是一个JavaScript对象初始值设定项。
-
它没有定义一个数组,它定义了一个对象 。
对象没有length
属性。 如果你想让你的chatmessage
说出它有多less属性,你将不得不明确地添加第三个属性(这引发了值是2还是3的问题:-))。 或者,也可以使用“key”和“value”属性来创build一个对象数组,但这样做会很麻烦。
如果需要,可以通过几种方法确定对象具有多less个属性:
-
Object.keys(obj).length
会告诉你这个对象有多less个自己可枚举的属性(如果你使用的是ES2015,忽略任何Symbol
名称)。 该数字将不包含任何inheritance的属性或任何非可枚举的属性。 在你的例子中的答案是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。:-))