从对象中删除所有符号的最有效方法是什么?

时间:2019-05-27 06:56:55

标签: javascript object ecmascript-6

比方说,我有一个对象,我想在其中保留仅内部密钥/符号对。鉴于...

let obj = {
    [Symbol.for('foo')]: 'internal-only member',
    a: 1,
    b: 2,
    c: 3
}

当我通过API将这些符号返回给客户端时,我想从对象中删除所有符号,因为客户端对其没有任何用处。

我想返回一个通用函数:

{
    a: 1,
    b: 2,
    c: 3
}

换句话说:

returnScrubbedObj = (obj) => {
    // filter/map/remove/copy etc the original object to a new object without symbols 
    return objWithoutSymbols
}

我知道可能有很多不同的方法可以做到这一点;只是在寻找最好/最高效的产品。

3 个答案:

答案 0 :(得分:1)

您可以获取条目并为条目构建一个新对象。

let obj = {
    [Symbol.for('foo')]: 'internal-only member',
    a: 1,
    b: 2,
    c: 3
}
console.log(Object.fromEntries(Object.entries(obj)));

答案 1 :(得分:1)

您可以使用JSON方法:

let obj = {[Symbol.for('foo')]:'internal-only member',a:1,b:2,c:3};
const res = JSON.parse(JSON.stringify(obj));
console.log(res);

使用reducetypeof的更详细的版本:

let obj = {[Symbol.for('foo')]:'internal-only member',a:1,b:2,c:3};
const res = Object.entries(obj).reduce((acc, [k, v]) => typeof k == "symbol" ? acc : (acc[k] = v, acc), {});
console.log(res);

由于您询问了效率,the reduce method is faster

答案 2 :(得分:0)

在对象上使用for .. in很方便,占用的内存和空间也更少。

let obj = {
    [Symbol.for('foo')]: 'internal-only member',
    a: 1,
    b: 2,
    c: 3
}

let newObj = {};
for(let prop in obj) {
  if(obj.hasOwnProperty(prop)){
     newObj[prop] = obj[prop];
  }
}

console.log(newObj);

相关问题