2

我有一个这样的对象:

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'

如果这有意义...

4

1 回答 1

9

它不漂亮,但你可以使用这样的东西:

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 或其他任何内容)将取决于您如何使用它。

于 2011-02-20T21:45:38.507 回答