无法更改JSON.stringify替换函数中的可枚举属性?

时间:2012-11-25 07:43:57

标签: javascript json

我正在尝试在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函数之前,过滤掉了不可枚举的属性。不确定。

1 个答案:

答案 0 :(得分:1)

如果.stringify过滤掉了不可枚举的属性,那么是的,它们在回调中不可用 - 它已经完成了那个过滤器。为什么不在字符串化之前遍历对象的所有键,并使用内部逻辑将其设置为可枚举(如果尚未设置)。然后,只需致电JSON.stringify(obj);即可。不幸的是,正如您所指出的,for in循环和jQuery的$.each不会循环遍历不可枚举的密钥。我发现.getOwnPropertyNames应该达到你想要的效果 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

以下是使用它的示例,类似于您提供的代码:

http://jsfiddle.net/9Em82/

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]);
}