2016-10-05 9 views
1

Я использую библиотеку, которая принимает объект JS в качестве входа. К сожалению, JSONP api, который я использую, возвращает объект, содержащий геттеры и сеттеры, которые эта конкретная библиотека не знает, как обращаться.Как удалить все геттеры и сеттеры из объекта в Javascript и сохранить чистое значение

Как удалить все геттеры и сеттеры из объекта, сохраняя значения свойств, поэтому у меня есть обычный объект JavaScript JavaScript?

+0

Вы можете поделиться некоторыми примерами? –

+3

Как выглядит JSONP? JSON не может содержать никаких геттеров или сеттеров. –

+2

'JSON.stringify (myobj)' – evolutionxbox

ответ

1

решение для этого частного случая/окружающей среды/настройка может выглядеть ...

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/

+0

да в этом конкретном но _ не всегда может использоваться –

+0

@PatrickScott - в случае, если сохраненные значения корректно инкапсулируются, вы по-прежнему получаете обработку getters/seters бесплатно через 'JSON.parse (JSON.stringify (model));'. –

+1

Вместо того, чтобы использовать 'delete', вам лучше передать обратный вызов' parse' или 'stringify' – Bergi

0

Используйте 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; 
} 
+1

Как и идея, '' 'getOwnPropertyDescriptors'' не является функцией, но на самом деле это' '' getOwnPropertyDescriptor''', поэтому, возможно, придется переключать это, чтобы сначала получить ключи и получить дескриптор для каждого? –

+1

выглядит так, как это предлагается, однако еще не доступно (входит в es2017/es8) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors –

0

После пробовав всевозможные вещи, такие как сериализация в JSON и обратно, я закончил тем, что написал простую функцию beowClone для этого:

const shallowClone = (obj) => { 
    return Object.keys(obj).reduce((clone, key) => { 
    clone[key] = obj[key]; 
    return clone; 
    }, {}); 
} 
+0

все еще не очень доволен этим ответом, хотя –

+1

... http://jsfiddle.net/w23uLttu/9/ ... но ваш подход не удалит псевдо-частную нотацию, например. '_name' vs' name' с обоими ссылаются на одно и то же значение ... '{_name:« Услышьте меня? », имя:« Услышь? »}' - с вашим примером вы уже достигли того же результата через 'JSON.parse (JSON.stringify (модель))'. Правильное/окончательное решение должно учитывать эти дубликаты. –

+0

да, возможно, что-то вроде этого в сочетании с getOwnPropertyDescriptor –