RasmonT
RasmonT

Reputation: 403

how to remove object from the JSON file?

I'm unable to remove random code generated from the JSON array object, .splice worked very fine for me while removing the whole line with all data. I have different tiers of codes, in this example I will need to remove just the random generated value from the "promoCodes" I will always receive this error:

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"
        ]
      }
    }

Code:

//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')

With delete I tried: delete [randomcode]; delete mycodes[randomcode]; but nothing is being done in this case, as it never gets removed from the file.

Upvotes: 0

Views: 755

Answers (1)

Ahmed Elhady
Ahmed Elhady

Reputation: 24

The problem is you're trying to call the slice method on an object - the mycodes object - and this not gonna happen, because, the slice method is only defined for String or Array Standard built-in objects.

One Solution

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'
);

Upvotes: 1

Related Questions