Допустим, у меня есть объект, в котором я хочу сохранить только внутренние ключи/пары с символами. Дано...
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))
будет работать, но, возможно, из-за того, что я использую TypeScript (не упоминал об этом выше), он меняет определение объекта, поскольку это не удаляет символы из объекта. Странный.
Я думаю, что я делал что-то не так, так как это работает.
Вы можете получить записи и создать новый объект записей.
let obj = {
[Symbol.for('foo')]: 'internal-only member',
a: 1,
b: 2,
c: 3
}
console.info(Object.fromEntries(Object.entries(obj)));
Спасибо, это хороший ответ, за исключением того, что я еще не на ECMA2019. Я возьму это в закладки на будущее.
Вы можете использовать методы JSON:
let obj = {[Symbol.for('foo')]:'internal-only member',a:1,b:2,c:3};
const res = JSON.parse(JSON.stringify(obj));
console.info(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.info(res);
А раз вы спрашивали об эффективности, то метод reduce
быстрее.
Здесь удобно и меньше памяти и места использовать 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.info(newObj);
попробуй
JSON.parse(JSON.stringify(obj))