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

tag*_*eit 5 javascript object ecmascript-6

假设我有一个对象,我想在其中保留仅限内部的密钥/符号对。鉴于...

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

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

我想要一个将返回的通用函数:

{
    a: 1,
    b: 2,
    c: 3
}
Run Code Online (Sandbox Code Playgroud)

换句话说:

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

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

Jac*_*ord 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);
Run Code Online (Sandbox Code Playgroud)

reduce使用and的更详细版本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);
Run Code Online (Sandbox Code Playgroud)

而且既然你问的是效率,那这个reduce方法就更快了。