Node js 中 Json 长度始终未定义

Bil*_*ean 2 javascript json node.js

我正在尝试迭代简单的 json 数组,但它总是返回数组的长度 is 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);
}); 
Run Code Online (Sandbox Code Playgroud)

当私有事件被触发时它返回

undefined - Hello - sjdfjhsdf
Run Code Online (Sandbox Code Playgroud)

我认为它将length关键字视为 json 数组键,例如{"length":40}

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

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

T.J*_*der 5

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

有两个问题:

  1. 那不是 JSON。JSON 是一种用于数据交换的文本表示法。如果您正在处理 JavaScript 源代码,而不是处理 string 那么您就不是在处理 JSON。它是一个 JavaScript 对象初始值设定项。

  2. 它不定义数组,而是定义对象

对象没有length属性。如果您想要chatmessage说明它有多少个属性,则必须显式添加第三个属性(这会引发该值应该是 2 还是 3 :-) 的问题)。或者,您可以将其设置为具有“key”和“value”属性的对象数组,但这使用起来会很尴尬。

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

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

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

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

正如我上面所说,Object.keys会告诉你该对象有多少个自己的可枚举属性。如果您想找出有多少个对象,答案是 1。

如果您的目标是发送一系列聊天消息,那么您需要像这样创建:

var chatmessages = [
    {"message":"Hello", "to":"sjdfjhsdf"}
];
Run Code Online (Sandbox Code Playgroud)

这定义了一个包含一个条目的数组:代表一条聊天消息的单个对象。多个将用 分隔,

var chatmessages = [
    {"message":"Hello", "to":"sjdfjhsdf"},         // First message
    {"message":"Hello again", "to":"sjdfjhsdf"}    // Second message
];
Run Code Online (Sandbox Code Playgroud)

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