【问题标题】:What's the most efficient way to remove all symbols from an object?从对象中删除所有符号的最有效方法是什么?
【发布时间】:2019-10-12 17:39:47
【问题描述】:

假设我有一个对象,我想在其中保留仅限内部的键/符号对。给定...

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
}

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

【问题讨论】:

  • 试试JSON.parse(JSON.stringify(obj))
  • 通常我认为JSON.parse(JSON.stringify(obj)) 会起作用,但可能是因为我使用的是 TypeScript(上面没有提到)它正在更改对象的定义,因为这不会从物体。奇怪。
  • 我认为我做错了什么,因为这确实有效。

标签: javascript object ecmascript-6


【解决方案1】:

您可以获取条目并构建条目的新对象。

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

【讨论】:

  • 谢谢,这是一个很好的答案,只是我还没有参加 ECMA2019。我会把它收藏起来以备将来使用。
【解决方案2】:

您可以使用 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);

使用reduce 和typeof 的更详细的版本:

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。

【讨论】:

    【解决方案3】:

    在此对象上使用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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      相关资源
      最近更新 更多