我正在尝试在replacer函数中序列化非可枚举属性。
这里有什么问题?
请帮忙。var obj = {x:1,y:2};
Object.defineProperty(obj,"x",{enumerable:false});
var s = JSON.stringify(obj,function(key,value){
if(this.propertyIsEnumerable(key) == false){
Object.defineProperty(this,key,{enumerable:true});
}
return value;});
//"{"y":2}"
// x remains not enumerable
我想在执行replacer函数之前,过滤掉了不可枚举的属性。不确定。
答案 0 :(得分:1)
如果.stringify
过滤掉了不可枚举的属性,那么是的,它们在回调中不可用 - 它已经完成了那个过滤器。为什么不在字符串化之前遍历对象的所有键,并使用内部逻辑将其设置为可枚举(如果尚未设置)。然后,只需致电JSON.stringify(obj);
即可。不幸的是,正如您所指出的,for in
循环和jQuery的$.each
不会循环遍历不可枚举的密钥。我发现.getOwnPropertyNames
应该达到你想要的效果 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames
以下是使用它的示例,类似于您提供的代码:
var obj = {x:1,y:2};
Object.defineProperty(obj,"x",{enumerable:false});
var all = Object.getOwnPropertyNames(obj);
for (var i = 0, j = all.length; i < j; i++) {
console.log("KEY: " + all[i]);
}