关于 JSON.parse 还原函数 reviver 返回 undefined 的问题?

问题描述

我需要对一个对象进行处理,过滤掉某些键和改造某个键值,得到我想要的结构。用JSON.parse结合reviver函数处理。可是得到undefined的诡异结果。

请问下面的代码为何得不到我想要的结果呢?
我现在能得到正确的结果,但是下面的代码也不存在错误,为何得不到我想要的结果,请分析。

问题出现的环境背景及自己尝试过哪些方法

运行环境: node V9.11.2

相关代码

/**
 * 过滤测试表格数据
 * @param {String} key 对象键
 * @param {*} value 键值
 */
let filterTestData = (key, value) => {
    if (['id', 'interName', 'opt', 'ruleStr'].includes(key)) {
        return value;//这些键的值 返回原值
    } else if (key === 'algorithmOptRules') {
        console.log(value instanceof Array)
        let names = []
        value.forEach(ele => {
            names.push(ele['name'])
        })
        return names.join('、')//改造 这个键值
    } else {
        return undefined;//删除其他键
    }
}
let test = JSON.stringify({
    "id": "5c34650e307f782408c4501b",
    "interId": "5c34650e307f782408c4501b",
    "interName": "接口名字",
    "className": "aaaaaaaa",
    "route": "/a/b/c",
    "opt": "mac", 
    "ruleStr": "00:0A:02:0B:03:0C", //表格显示 6
    "algorithmOptRules": [{ 
            "index": 1,
            "algoId": "5c34677c307f781058f179a9",
            "group": "aa",
            "name": "afafafafaf" 
        },
        { 
            "index": 1,
            "algoId": "5c34677c307f781058f179a9",
            "group": "aa",
            "name": "你还"
        }
    ]
})
let newTest = JSON.parse(test, filterTestData)
console.log(newTest); //undefined

你期待的结果是什么?

{ 
  id: '5c34650e307f782408c4501b',
  interName: '接口名字',
  opt: 'mac',
  ruleStr: '00:0A:02:0B:03:0C',
  algorithmOptRules: 'afafafafaf、你还'
}
阅读 3.2k
2 个回答

使用reviver函数

当遍历到最顶层的值(解析值)时,传入 reviver 函数的参数会是空字符串 ""。在编写 reviver 函数时,要注意到这个特例。
if(key === '') return value;     // 如果到了最顶层,则直接返回属性值

12

因为 value 是空

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题