Удаление целевого параметра из объекта в ES6 с помощью оператора распространения - PullRequest
5 голосов
/ 13 июня 2019

Я пытаюсь удалить свойство из объекта , используя оператор распространения .Традиционно я делал это:

const original_object = { prop1 : 'string1', prop2: 'string2' };
const { prop1, ...rest } = original_object;

В описанной выше ситуации удаленное свойство (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';

Какое самое элегантное / простое решение для этого?Я хочу, чтобы все, кроме одного prop3 из prop2, было включено в объект в точно такой же структуре.

1 Ответ

4 голосов
/ 13 июня 2019

Сделайте это в два шага - сначала деструктурируйте prop3, затем создайте новый объект, объединив остальную часть внешнего объекта с проп2 и удалив из него проп3:

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);

Хотя вы могли бы сделать это всего лишь одним заявлением с помощью хака, я бы не рекомендовал это.

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

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);

Просто ради любопытства (пожалуйста, не делайте этого) хаком будет использование свойства по умолчанию, которое определенно не будет существовать:

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);

Но это будет значительно (и неоправданно) сбивать с толку.

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