使用 javascript 删除 json 值

Deleting json value with javascript

我尝试了很多方法,但我被 javascript 中的一个简单函数卡住了,我不知道我需要在哪里寻找...问题是这样的:

我有一个像这样的 Json 文件:

{
  "blacklist": [
    {
      "email": "strangemail@gmail.com"
    },
    {
      "email": "strangemail1@gmail.com"
    },
    {
      "email": "strangemail2@gmail.com"
    },
    {
      "email": "fianlt@gmail.com"
    },
    {
      "email": "finalstatustest@gmail.com"
    }
  ]
}

我想简单地删除一封具有如下简单功能的电子邮件:

 function cancel(email) // parameter that contain the value to delete
{
  let rawdata = fs.readFileSync('pvt.json'); //get local json file
  let mydata = JSON.parse(rawdata); //parsing rawdata 

  var key = email; //setting up key
  delete mydata.blacklist[key]; //using delete function for delete an element

  let data = JSON.stringify(mydata, null, 2); //stringify the result
  fs.writeFileSync('pvt.json', data); // overwrite local file with new one with all changes
}

问题是......它不起作用......我不知道为什么......我试图阅读文档,但我没有找到任何解决方案

delete 运算符用于从 对象 中删除 属性,使用 属性的名字。您正在尝试使用数组中对象的 属性 的值从 数组 中删除 entry

假设 email 是一个变量,其中包含您要删除的条目中的电子邮件地址,filter 是一种简单的方法:

mydata.blacklist = mydata.blacklist.filter(entry => entry.email !== email);

filter 从原始数组中满足回调条件的条目构建一个新数组——在这种情况下,它们的 email 属性 与您要删除的电子邮件地址不匹配。

如果您想就地修改数组而不是创建一个新数组,您可以使用 findIndex and splice:

const index = mydata.blacklist.findIndex(entry => entry.email === email);
if (index !== -1) {
    mydata.blacklist.splice(index, 1); // Remove the entry at the index
}

Delete 用于从 object 中删除 key-value。这里有一个 array of items[objects]。您应该使用 filter 删除不需要的 element.

更新:

function cancel(selectedEmail) {
  let rawdata = fs.readFileSync("pvt.json"); //get local json file
  let mydata = JSON.parse(rawdata); //parsing rawdata
  mydata.blacklist = mydata.blacklist.filter(
    (item) => item.email !== selectedEmail.email
  );
  fs.writeFileSync("pvt.json", JSON.stringify(mydata, null, 2)); // overwrite local file with new one with all changes
}

样本:

const info = {
  blacklist: [
    {
      email: "strangemail@gmail.com",
    },
    {
      email: "strangemail1@gmail.com",
    },
    {
      email: "strangemail2@gmail.com",
    },
    {
      email: "fianlt@gmail.com",
    },
    {
      email: "finalstatustest@gmail.com",
    },
  ],
};
const selectedEmail = {email: "finalstatustest@gmail.com"}

info.blacklist = info.blacklist.filter(item => item.email !== selectedEmail.email)
console.log(info)