使用扩展运算符从ES6中的对象中删除目标参数

shn*_*shn 5 javascript typescript spread-syntax

我正在尝试使用传播运算符从对象中删除属性。传统上,我这样做:

const original_object = { prop1 : 'string1', prop2: 'string2' };
const { prop1, ...rest } = original_object;
Run Code Online (Sandbox Code Playgroud)

在上述情况下,移除的属性(prop1)将不再存在于其余对象中。

假设有一个我想删除的更复杂的属性,例如对象中的一个对象。

const original_object = {
    prop1: 'string1'
    prop2: {
        prop3: 'string3',
        prop4: 'string4'
    }
}
const { *remove prop3 of prop2 only here*, ...rest} = original_object;
console.log(prop3); // => 'string3';
Run Code Online (Sandbox Code Playgroud)

什么是最优雅/最简单的解决方案?我希望除了对象之一之外prop3的所有东西都prop2以完全相同的结构包含在对象中。

Cer*_*nce 4

分两步完成 - 首先解构prop3out,然后创建一个新对象,将外部对象的其余部分与 prop2 结合起来,并从中删除 prop3:

const original_object = {
    prop1: 'string1',
    prop2: {
        prop3: 'string3',
        prop4: 'string4'
    }
};
const { prop2: { prop3, ...restProp2 }, ...restOrig} = original_object;
const newObj = { ...restOrig, prop2: restProp2 };
console.log(prop3); // => 'string3';
console.log(newObj);
Run Code Online (Sandbox Code Playgroud)

虽然您可以通过 hack 在一个语句中完成此操作,但我不建议这样做。

如果您发现自己经常使用深度嵌套的属性执行此操作,并且不喜欢额外的行,则可以考虑使用以下辅助函数:

const getNestedFrom = (obj, propStr) => {
  // make a copy, don't mutate the original object
  const newObj = JSON.parse(JSON.stringify(obj));
  const props = propStr.split('.');
  const lastProp = props.pop();
  const lastObj = props.reduce((a, prop) => a[prop], newObj);
  const val = lastObj[lastProp];
  delete lastObj[lastProp];
  return [newObj, val];
};


const original_object = {
    prop1: 'string1',
    prop2: {
        prop3: 'string3',
        prop4: 'string4'
    }
};
const [newObj, prop3] = getNestedFrom(original_object, 'prop2.prop3');
console.log(prop3); // => 'string3';
console.log(newObj);
Run Code Online (Sandbox Code Playgroud)

只是出于好奇(请不要这样做),黑客将使用肯定不存在的默认属性:

const original_object = {
    prop1: 'string1',
    prop2: {
        prop3: 'string3',
        prop4: 'string4'
    }
};
const [
  { prop2: { prop3, ...restProp2 }, ...restOrig},
  newObj = { ...restOrig, prop2: restProp2 }
] = [original_object]
console.log(prop3); // => 'string3';
console.log(newObj);
Run Code Online (Sandbox Code Playgroud)

但这会造成明显(且不必要)的混乱。