Какой самый эффективный способ удалить все символы из объекта?

Допустим, у меня есть объект, в котором я хочу сохранить только внутренние ключи/пары с символами. Дано...

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))

AsukaSong 27.05.2019 08:59

Обычно я думаю, что JSON.parse(JSON.stringify(obj)) будет работать, но, возможно, из-за того, что я использую TypeScript (не упоминал об этом выше), он меняет определение объекта, поскольку это не удаляет символы из объекта. Странный.

tagyoureit 27.05.2019 18:35

Я думаю, что я делал что-то не так, так как это работает.

tagyoureit 28.05.2019 04:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
539
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете получить записи и создать новый объект записей.

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

Спасибо, это хороший ответ, за исключением того, что я еще не на ECMA2019. Я возьму это в закладки на будущее.

tagyoureit 28.05.2019 04:53
Ответ принят как подходящий

Вы можете использовать методы 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);

Другие вопросы по теме