动态删除对象属性 JavaScript

Cha*_*ish 7 javascript

我有以下代码来获取给定对象的键。因此,对于对象,{"hello": {"data": {"a": "world", "b": "random"}}}如果传入的键是hello.data.a,则输出将是world

(object, key) => {
    const keyParts = key.split(".");
    let returnValue = object;
    keyParts.forEach((part) => {
        if (returnValue) {
            returnValue = returnValue[part];
        }
    });
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何以相同的方式动态删除属性。因此,例如对于相同的对象和键,它会将对象变异为{"hello": {"data": {"b": "random"}}}.

基本上,我想同样的行为delete object.hello.data.a。但问题是该hello.data.a部分是传入的动态字符串。当然,delete object[key]由于键具有嵌套级别,因此类似的东西不起作用。如果它只有 1 级深,它会起作用,但不适用于嵌套项目。

另一个重要的注意事项是,在这种情况下,性能极其重要。因此,尽管创建一个新对象并复制除我要删除的对象之外的所有属性可能会起作用,但我非常担心该对象与delete关键字的性能影响。

由于其他外部因素,我也不想将属性值设置为nullundefined。我希望从对象中实际删除密钥。

我怎样才能做到这一点?

Cer*_*nce 6

要删除,.pop()关闭最后一个键来标识要删除的属性。如果您想避免使用该delete关键字,您还需要替换该键所在的最后一个对象,而不是对其进行变异,因此也要.pop()关闭下一个最后一个键。

然后,使用您当前的方法(或.reduce)访问最后一个外部对象。要删除其中一个键:

  • delete使用已保存的密钥进行变异,请使用delete[nextLastKey][lastKey]
  • 要创建一个全新的对象但没有保存的键,请使用 rest 语法lastKey在创建新对象期间排除它,然后将新对象分配给nextLastKey父对象的 :

const fn = (object, key) => {
    const keys = key.split(".");
    const lastKey = keys.pop();
    const nextLastKey = keys.pop();
    const nextLastObj = keys.reduce((a, key) => a[key], object);
    
    // delete version:
    // delete nextLastObj[nextLastKey][lastKey]
    
    // non-delete version:
    const { [lastKey]: _, ...rest } = nextLastObj[nextLastKey];
    nextLastObj[nextLastKey] = rest;
    return object;
}

const obj = {"hello": {"data": {"a": "world", "b": "random"}}};
const result = fn(obj, 'hello.data.a');
console.log(result);
Run Code Online (Sandbox Code Playgroud)