向数组中添加的对象变得未定义

Posted

技术标签:

【中文标题】向数组中添加的对象变得未定义【英文标题】:Added objects to an array become undefined 【发布时间】:2020-12-24 19:03:39 【问题描述】:

所以,我正在为我的 Discord 机器人的命令编写一些代码,该命令将对象添加到存储在 JSON 文件中的对象数组中。这是实现这一目标的代码:

let rawdata = fs.readFileSync('config.json');
let blacklist = JSON.parse(rawdata);

var newWord = "word": args[3], "count": 0
blacklist.words.push(newWord);

let data = JSON.stringify(blacklist);
fs.writeFileSync('config.json', data);

它的作用是获取命令中的第 4 个单词 (args[3]) 并将其放入对象 ("word": args[3], "count": 0) 中,然后将其添加到 JSON 文件中的对象列表中。这可行,但是当我尝试获取此对象列表时,机器人添加的对象将返回为undefined

这是 JSON 文件:

"words":["string":"test","count":0,"word":"abc","count":0]

列表中的第一个对象"string":"test","count":0 我是在创建文件时手动添加的,但是第二个对象"word":"abc","count":0 是由机器人添加的。

这是我用来获取对象列表的代码:

var words = ""
for (i = 0; i < blacklist.words.length; i++) 
    words += "- " + blacklist.words[i].string + "\n";
    console.log(blacklist.words[i].string);

message.reply("here are the words in your blacklist:\n" + words);

结果如下:

我对 javascript 非常陌生,并且一直无法理解它的异步特性,所以我确信我做错了什么。

【问题讨论】:

【参考方案1】:

如果您仔细观察,您会在 JSON 生成的文件中定义两个不同的键:stringword。在这种情况下,您只会看到string 的值,即test。另一个对象没有string 的密钥。

您可以做的是 1. 更改键以使其匹配或 2. 通过使用内联 if/else 来使用这两个键。

for (i = 0; i < blacklist.words.length; i++) 
    words += "- " + blacklist.words[i].string + "\n";
    console.log(blacklist.words[i].string || blacklist.words[i].word);


【讨论】:

【参考方案2】:
for (i = 0; i < blacklist.words.length; i++) 
    words += "- " + blacklist.words[i].string + "\n";
    console.log(blacklist.words[i].string);

此代码要访问黑名单对象的单词数组“字符串”键。 检查您的 JSON 文件第二个元素的键,它不是“字符串”

【讨论】:

以上是关于向数组中添加的对象变得未定义的主要内容,如果未能解决你的问题,请参考以下文章

循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?

`this.some_property` 在匿名回调函数中变得未定义

将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”

knockout.js 主视图模型中的一个视图模型(添加项目变得未定义)

领域对象列表函数未定义,即使对象已定义且列表已填充

无法在对象数组上读取未定义的属性“push”