无法拼接对象数组中的项目

Posted

技术标签:

【中文标题】无法拼接对象数组中的项目【英文标题】:Can't splice an item from an array of objects 【发布时间】:2020-12-25 00:12:22 【问题描述】:

我正在编写一个 Discord 机器人,其中一部分是存储在 JSON 文件中的对象数组。用户将能够使用不同的命令从数组中添加和删除对象。数组中的每个对象都有两个属性:"string":"test","count":0

我有一些代码可以成功地将对象添加到数组中:

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

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

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

我还编写了一些从数组中删除对象的代码:

var remove = false;
for (i = 0; i < blacklist.words.length; i++) 
  if (blacklist.words[i].string === args[3]) 
    blacklist.words.splice(i, 1);
    var removed = true;
  


if (removed) 
  message.reply(
    "the word `" +
      args[3] +
      "` has been successfully remove from your blacklist!"
  );
 else 
  message.reply(
    "I couldn't find the word `" + args[3] + "` on your blacklist!"
  );

问题是,将对象添加到此数组的代码可以正常工作,但删除对象的代码却不行。当我发送删除对象的命令时,机器人回复 "the word" + args[3] + "has been successfully remove from your blacklist!" 这让我认为代码运行成功,但实际上并没有工作。

【问题讨论】:

但实际上不工作“不工作”是什么意思? @Berto99 当我运行命令时,我检查了config.json 并且我应该删除的对象仍在文件中。 可能你需要写回文件上的对象,不是吗? 啊,是的,当然,谢谢。有时候我很傻xD 【参考方案1】:

在您的代码中,removed 在 for 循环中被重新声明。

我还添加了break,所以即使得到结果也不需要遍历整个数组

var remove = false;
for (i = 0; i < blacklist.words.length; i++) 
    if (blacklist.words[i].string === args[3]) 
        blacklist.words.splice(i, 1);
        removed = true;
        break;
    


if (removed) 
    message.reply("the word `" + args[3] + "` has been successfully remove from your blacklist!");
 else 
    message.reply("I couldn't find the word `" + args[3] + "` on your blacklist!");

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 补充说明【参考方案2】:

如果你使用的是 ES5,你可以使用过滤功能

const filteredBlackList = blacklist.words.filter((item) => item.string !== args[3]);

var remove = false;
if (blacklist.words.length !== filteredBlackList.length) 
   remove = true;


if (removed) 
  message.reply("the word `" + args[3] + "` has been successfully remove from 
  your blacklist!");
 else 
  message.reply("I couldn't find the word `" + args[3] + "` on your 
  blacklist!");

【讨论】:

以上是关于无法拼接对象数组中的项目的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Django 两个对象数组中的项目 ID 与 if 条件匹配

数组对象中相同的参数拼接成一个对象

与 nodejs、mongoose 和 JSON 对象数组拼接

数组对象中相同的参数拼接成一个对象

将对象数组的值拼接成句子

两个数组交叉合并为一个数组