提问人:RasmonT 提问时间:3/28/2022 最后编辑:RasmonT 更新时间:3/28/2022 访问量:709
如何从JSON文件中删除对象?
how to remove object from the JSON file?
问:
我无法删除从 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')
我试过了:但在这种情况下什么也没做,因为它永远不会从文件中删除。delete
delete [randomcode];
delete mycodes[randomcode];
答:
1赞
Ahmed Elhady
3/28/2022
#1
问题是您尝试在对象上调用该方法,但这不会发生,因为该方法仅为或标准内置对象定义。slice
object
mycodes
slice
String
Array
一个解决方案
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
这真的很有趣,你知道如何让它工作吗?我很好奇,应该与对象一起工作。无论如何,非常感谢这个答案!delete
delete
0赞
Ahmed Elhady
3/28/2022
实际上,您不能从带有运算符的对象中删除随机代码,因为它仅适用于对象属性,并且数组中的 - 例如 - ' “TEST2 - 1”' 项不是属性,它只是数组中的项。例如,如果您想从 TIER1 对象中删除保存促销代码的属性,您可以执行类似操作的操作:这将删除带有 delete 运算符的 promoCodes 数组,因为它是 TIER1 对象中的属性。TIER1
delete
promoCodes
delete mycodes.TIER1.promoCodes;
评论
delete