【问题标题】:Json length is always undefined in node jsJson 长度在节点 js 中始终未定义
【发布时间】:2016-10-05 18:20:33
【问题描述】:

我正在尝试迭代简单的 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

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

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

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

【问题讨论】:

  • chatmessage 是一个对象,而不是一个数组。对象没有内置的length
  • 对象没有没有length属性

标签: javascript json node.js


【解决方案1】:

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

有两个问题:

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

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

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

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

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

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

我试过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。 (如果您的母语处理复数与英语的方式不同,我会提到这一点;在地球上各种人类语言中处理复数的方式有很多很多。:-))

【讨论】:

  • 最后一句话很有趣 ;) Object.keys(OBJ) 可以帮忙!
  • @Rayon:哈哈,我刚刚添加了一条关于Object.keysObject.getOwnPropertyNames 的注释。
猜你喜欢
  • 2017-08-28
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2019-11-03
  • 2021-04-04
  • 2015-07-25
相关资源
最近更新 更多