Удаление свойств объекта JS на несколько уровней - PullRequest
1 голос
/ 20 февраля 2011

У меня есть такой объект:

var myObj = {
    first: {
        sub: {
            level: "some text",
            level2: "some more text"
        },
        sub2: {
            level3: "Something"
        }
    },
    second: {
        stuff: "More stuff...lots of stuff"
    }
}

что я хочу сделать, это сказать:

delete myObj.first.sub.level

Но я не буду знать, что передается, илисколько уровней мне нужно пройти, чтобы удалить правильное свойство, то есть оно может быть просто:

Storage.removeItem('myObj.first'); // This is currently working

или что-то более сложное:

Storage.removeItem('myObj.first.sub2.level3'); // This doesn't work because I'm more than 1 level into the object.

Я вроде какзастрял, потому что я могу добраться до точки, где у меня есть ключ "level3" и его свойство "Something", но я не могу понять, как правильно сделать шаг назад для удаления полной части этого объекта.

Мне нужно скопировать его место в myObj, чтобы я мог удалить полностью переданный объект.

'myObj.first.sub.level3'

Если это имеет смысл ...

1 Ответ

8 голосов
/ 21 февраля 2011

Это не красиво, но вы можете использовать что-то вроде этого:

function deepDelete(target, context) {
  // Assume global scope if none provided.
  context = context || window;

  var targets = target.split('.');

  if (targets.length > 1)
    deepDelete(targets.slice(1).join('.'), context[targets[0]]);
  else
    delete context[target];
}

deepDelete('first.sub.level3', myObj);

deepDelete('myObj.first.sub2.level3');

Вероятно, было бы неплохо изменить его так, чтобы он проверял typeof context[targets[0]] !== 'undefined' перед спуском. Как именно вы отреагируете на это (верните false, throw или что-то еще), будет зависеть от того, как вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...