javascript - Eliminarea unui parametru vizat dintr-un obiect în ES6 folosind operatorul spread


Încerc să elimin o proprietate dintr-un obiect folosind operatorul spread. În mod tradițional am făcut asta:

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

În situația de mai sus, proprietatea eliminată (prop1) nu va mai exista în cadrul obiectului rest.

Să presupunem că există o proprietate mai complexă pe care aș dori să o elimin, cum ar fi un obiect în interiorul obiectului.

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

Care este soluția cea mai elegantă/mai simplă pentru a face acest lucru? Vreau ca totul, cu excepția prop3 din prop2, să fie inclus în obiect, în exact aceeași structură.

Răspuns #1

Fă-o în doi pași - mai întâi destrucurează prop3, apoi creează un obiect nou, combinând restul obiectului exterior cu prop2, din care a fost eliminat 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);

Deși ai putea să faci asta într-o singură declarație cu un truc, nu aș recomanda acest lucru.

Dacă te găsești făcând acest lucru des cu proprietăți profund imbricate și nu-ți place linia suplimentară, poate ar trebui să iei în considerare o funcție ajutătoare pe linia următoare:

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

Doar din curiozitate (te rog să nu faci asta), metoda ar fi să folosești o proprietate implicită care cu siguranță nu va exista:

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

Dar asta ar fi semnificativ (și inutil) confuz.