如何从JSON文件中删除对象?

how to remove object from the JSON file?

提问人:RasmonT 提问时间:3/28/2022 最后编辑:RasmonT 更新时间:3/28/2022 访问量:709

问:

我无法删除从 JSON 数组对象生成的随机代码,在删除包含所有数据的整行代码时对我来说效果很好。我有不同层次的代码,在这个例子中,我只需要从“promoCodes”中删除随机生成的值,我总是会收到这个错误:.splice

mycodes.slice(mycodes.indexOf(randomcode), 1)

TypeError: mycodes.indexOf is not a function

.JSON格式

{
    "TIER1": {
        "rewardSize": 1,
        "probability": 0.8,
        "numberOfCodes": 2,
        "rewardSubtype": 1,
        "totalRewardSize": 2,
        "promoCodes": [
            "TEST1 - 1",
            "TEST1 - 2"
        ]
      },
      "TIER2": {
        "rewardSize": 3,
        "probability": 0.25,
        "numberOfCodes": 2,
        "rewardSubtype": 2,
        "totalRewardSize": 6,
        "promoCodes": [
            "TEST2 - 1",
            "TEST2 - 2"
        ]
      },
      "TIER3": {
        "rewardSize": 10,
        "probability": 0.15,
        "numberOfCodes": 2,
        "rewardSubtype": 3,
        "totalRewardSize": 20,
        "promoCodes": [
            "TEST3 - 1",
            "TEST3 - 2"
        ]
      },
      "TIER4": {
        "rewardSize": 25,
        "probability": 0.05,
        "numberOfCodes": 2,
        "rewardSubtype": 4,
        "totalRewardSize": 50,
        "promoCodes": [
            "TEST4 - 1",
            "TEST4 - 2"
        ]
      },
      "TIER5": {
        "rewardSize": 50,
        "probability": 0.04,
        "numberOfCodes": 2,
        "rewardSubtype": 5,
        "totalRewardSize": 100,
        "promoCodes": [
            "TEST5 - 1",
            "TEST5 - 2"
        ]
      },
      "TIER6": {
        "rewardSize": 100,
        "probability": 0.01,
        "numberOfCodes": 2,
        "rewardSubtype": 6,
        "totalRewardSize": 200,
        "promoCodes": [
            "TEST6 - 1",
            "TEST6 - 2"
        ]
      },
      "TIER7": {
        "rewardSize": 1000,
        "probability": 0.001,
        "numberOfCodes": 2,
        "totalRewardSize": 2000,
        "promoCodes": [
            "TEST7 - 1",
            "TEST7 - 2"
        ]
      }
    }

法典:

//fs setup
const fs = require('fs');
let rawdata = fs.readFileSync(__dirname + '/newtest.json', 'utf8');
let mycodes = JSON.parse(rawdata);
const TIER1 = mycodes['TIER1']['promoCodes'] 


//something above...
const randomcode = TIER1[Math.floor(Math.random() * TIER1.length)];
console.log(randomcode); //logs random generated code 
mycodes.slice(mycodes.indexOf(randomcode), 1)
fs.writeFileSync(__dirname + '/newtest.json', JSON.stringify(mycodes, 0, 4), 'utf8')

我试过了:但在这种情况下什么也没做,因为它永远不会从文件中删除。deletedelete [randomcode];delete mycodes[randomcode];

JavaScript node.js 数组 JSON 切片

评论

0赞 RasmonT 3/28/2022
那么,当也不起作用时该怎么办?我发现它应该用于对象,没有错误,但它不会从 .JSON 文件。delete

答:

1赞 Ahmed Elhady 3/28/2022 #1

问题是您尝试在对象上调用该方法,但这不会发生,因为该方法仅为或标准内置对象定义。sliceobjectmycodessliceStringArray

一个解决方案

const fs = require('fs');
let rawdata = fs.readFileSync(__dirname + '/newtest.json', 'utf8');
let mycodes = JSON.parse(rawdata);
const TIER1 = mycodes.TIER1.promoCodes;
const randomcode = TIER1[Math.floor(Math.random() * TIER1.length)];

// get the item from the TIER1 array that matches the randomcode
const foundItem = TIER1.find((item) => item === randomcode);

// remove that item from the TIER1 array
TIER1.splice(TIER1.indexOf(foundItem), 1);

// save the data again to the json file.
fs.writeFileSync(
    __dirname + '/newtest.json',
    JSON.stringify(mycodes, 0, 4),
    'utf-8'
);

评论

0赞 RasmonT 3/28/2022
这真的很有趣,你知道如何让它工作吗?我很好奇,应该与对象一起工作。无论如何,非常感谢这个答案!deletedelete
0赞 Ahmed Elhady 3/28/2022
实际上,您不能从带有运算符的对象中删除随机代码,因为它仅适用于对象属性,并且数组中的 - 例如 - ' “TEST2 - 1”' 项不是属性,它只是数组中的项。例如,如果您想从 TIER1 对象中删除保存促销代码的属性,您可以执行类似操作的操作:这将删除带有 delete 运算符的 promoCodes 数组,因为它是 TIER1 对象中的属性。TIER1deletepromoCodesdelete mycodes.TIER1.promoCodes;