Подтвердить что ты не робот

Удаление всех свойств объекта

У меня есть этот объект Javascript.

req.session

В моем коде я добавляю свойства к этому объекту. Этими свойствами могут быть другие объекты, массивы или просто строки.

req.session.savedDoc = someObject; 
req.session.errors = ['someThing', 'anotherThing', 'thirdThing'];
req.session.message = 'someString'

Если позже я хотел бы удалить все добавленные свойства этого объекта, что является самым простым/лучшим способом?

Должен быть лучший способ, чем это?

// Delete all session values
delete req.session.savedDoc;
delete req.session.errors;
delete req.session.message;
4b9b3361

Ответ 1

Просто назначьте пустой объект:

req.session = {};

... и сборщик мусора сделает все остальное автоматически.


ОБНОВЛЕНИЕ:. Поскольку этот ответ спорный, я хотел бы предоставить более подробную информацию о точке.

Решение, приведенное выше, сделает работу для автора в текущей ситуации, а также любое другое действительное решение, предоставленное в этом вопросе. В основном это зависит от способа, которым разработчик хочет управлять устаревшими данными.

Объект сеанса может содержать данные, которые связаны с другой переменной, а установка нового пустого объекта на req.session не приведет к остановке ссылки на старые данные, поэтому старые данные будут доступны там, где это необходимо. Хотя правильный способ сохранить старые данные - клонировать исходный объект, сценарии реальной жизни могут быть разными. Рассмотрим следующий пример:

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

req.session = {};                          // let replace session with a new object
console.log( req.session, session );       // {}, {user: Object}

Мы все еще можем извлекать старые данные из переменной session, но req.session пуст: здесь установка нового объекта работает как альтернатива глубокому клонированию. Сборщик мусора не удалит данные из старого объекта req.session, поскольку он все еще ссылается на переменную session.

Глубокая очистка объекта с помощью метода @Dave или короче через Object.keys (который игнорирует свойства в цепочке прототипов и не требует каких-либо прокладок для node.js):

Object.keys(object).forEach(function(key) { delete object[key]; });

... явно удалит все значения из объекта req.session, и поскольку переменная session связана с одним и тем же объектом, session также станет пустым. Посмотрите, как это работает:

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

Object.keys(req.session).forEach(function(key) { delete req.session[key]; });
console.log( req.session, session );       // {}, {}

Как вы можете видеть сейчас, в обоих случаях мы получаем пустые объекты.

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

Совершенно очевидно, что выбор подхода, который требуется предпринять, в основном зависит от вашего сценария кодирования, но в большинстве случаев req.session = {}; выполнит эту работу: он быстрый и короткий. Однако, если вы сохраняете ссылки на исходный объект в других переменных, вы можете рассмотреть возможность удаления глубоких неявных свойств объекта.

Ответ 2

@Ответ VisioN работает, если вы хотите очистить эту конкретную ссылку, но если вы действительно хотите очистить объект, я обнаружил, что это работает:

for (var variableKey in vartoClear){
    if (vartoClear.hasOwnProperty(variableKey)){
        delete vartoClear[variableKey];
    }
}

Ответ 3

Я вижу только одно правильное решение для удаления собственных свойств объекта:

for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x];

Если вы хотите использовать его более одного раза, вы должны создать функцию очистки:

function deleteProperties(objectToClean) {
  for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x];
}

В вашем случае это будет:

deleteProperties(req.session);

Это решение удаляет свойства из объекта везде, где он ссылается, и сохраняет старую ссылку.
Пример:
Использование пустого назначения объектов:

var x = {a: 5};
var y = x;
x = {};    // x will be empty but y is still {a: 5}, also now reference is gone: x !== y

Использование метода очистки:

var x = {a: 5};
var y = x;
deleteProperties(x);  // x and y are both empty and x === y

Ответ 4

Если вы хотите удалить все свойства без трогательных методов, вы можете использовать:

for(var k in req.session) if(!req.session[k].constructor.toString().match(/^function Function\(/)) delete req.session[k];

Ответ 5

Я сделал это вот так

var 
    i,
    keys = Object.keys(obj);
for(i = 0; i < keys.length; i++){
    delete obj[keys[i]];
}

Вы можете добавить его в Object (прототип не идеальный здесь) - будет статическим.

Object.defineproperties(Object, {
    'clear': function(target){
        var 
            i,
            keys = Object.keys(target);
        for(i = 0; i < keys.length; i++){
            delete target[keys[i]];
        }
    }
});

Затем вы можете очистить случайные объекты с помощью

Object.clear(yourObj);

yourObj = {} заменяет ссылку на новый объект, выше удаляет ее свойства - ссылка одинакова.