如何从 Javascript 中的对象中删除所有 getter 和 setter 并保持纯值
How to remove all getters and setters from an object in Javascript and keep pure value
我正在使用一个名为 JS 对象作为输入的库。不幸的是,我正在使用的 JSONP api returns 一个包含 getter 和 setter 的对象,这个特定的库不知道如何处理。
如何在保留属性值的同时从对象中删除所有 getter 和 setter,从而得到一个普通的 JavaScript 对象?
用getOwnPropertyDescriptors
得到当前所有的描述符,找到get
属性的,重新定义。但是,如果 属性 是可配置的,您将只能执行此操作。
const descriptors = Object.getOwnPropertyDescriptors(obj);
Object.keys(descriptors)
.filter(key => descriptors[key].get)
.forEach(key => Object.defineProperty(obj, key, {value: obj[key]}));
Object.getOwnPropertyDescriptors
是一个 ES7 提案。同时,这是 here:
的一个实现
function getOwnPropertyDescriptors(obj) {
const result = {};
for (let key of Reflect.ownKeys(obj)) {
result[key] = Object.getOwnPropertyDescriptor(obj, key);
}
return result;
}
这个特殊 case/environment/setting 的解决方案可能看起来像这样...
var
obj = JSON.parse(JSON.stringify(model));
console.log("obj before : ", obj);
Object.keys(obj).reduce(function (obj, key) {
if (obj["_" + key] === obj[key]) {
delete obj["_" + key];
}
return obj;
}, obj);
console.log("obj after : ", obj);
另请参阅... http://jsfiddle.net/w23uLttu/8/
在尝试了各种操作(例如序列化到 JSON 并返回)之后,我最终编写了一个简单的 shallowClone 函数来处理这个问题:
const shallowClone = (obj) => {
return Object.keys(obj).reduce((clone, key) => {
clone[key] = obj[key];
return clone;
}, {});
}
我正在使用一个名为 JS 对象作为输入的库。不幸的是,我正在使用的 JSONP api returns 一个包含 getter 和 setter 的对象,这个特定的库不知道如何处理。
如何在保留属性值的同时从对象中删除所有 getter 和 setter,从而得到一个普通的 JavaScript 对象?
用getOwnPropertyDescriptors
得到当前所有的描述符,找到get
属性的,重新定义。但是,如果 属性 是可配置的,您将只能执行此操作。
const descriptors = Object.getOwnPropertyDescriptors(obj);
Object.keys(descriptors)
.filter(key => descriptors[key].get)
.forEach(key => Object.defineProperty(obj, key, {value: obj[key]}));
Object.getOwnPropertyDescriptors
是一个 ES7 提案。同时,这是 here:
function getOwnPropertyDescriptors(obj) {
const result = {};
for (let key of Reflect.ownKeys(obj)) {
result[key] = Object.getOwnPropertyDescriptor(obj, key);
}
return result;
}
这个特殊 case/environment/setting 的解决方案可能看起来像这样...
var
obj = JSON.parse(JSON.stringify(model));
console.log("obj before : ", obj);
Object.keys(obj).reduce(function (obj, key) {
if (obj["_" + key] === obj[key]) {
delete obj["_" + key];
}
return obj;
}, obj);
console.log("obj after : ", obj);
另请参阅... http://jsfiddle.net/w23uLttu/8/
在尝试了各种操作(例如序列化到 JSON 并返回)之后,我最终编写了一个简单的 shallowClone 函数来处理这个问题:
const shallowClone = (obj) => {
return Object.keys(obj).reduce((clone, key) => {
clone[key] = obj[key];
return clone;
}, {});
}