Mam płaski obiekt JS:
{a: 1, b: 2, c: 3, ..., z:26}
Chcę sklonować obiekt z wyjątkiem jednego elementu:
{a: 1, c: 3, ..., z:26}
Jaki jest najłatwiejszy sposób na zrobienie tego (wolę używać ES6 / 7, jeśli to możliwe)?
Mam płaski obiekt JS:
{a: 1, b: 2, c: 3, ..., z:26}
Chcę sklonować obiekt z wyjątkiem jednego elementu:
{a: 1, c: 3, ..., z:26}
Jaki jest najłatwiejszy sposób na zrobienie tego (wolę używać ES6 / 7, jeśli to możliwe)?
Odpowiedzi:
Jeśli używasz Babel , możesz użyć następującej składni, aby skopiować właściwość bz x do zmiennej b, a następnie skopiować pozostałe właściwości do zmiennej y :
i zostanie przełożony na:
źródło
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
która została dodana w wersji 3.15.0 (3 lutego 2017 r.). Zobacz: commit c59a0bab
zakres.lub jeśli akceptujesz własność jako niezdefiniowaną:
źródło
Aby dodać do odpowiedzi Ilyi Palkin: możesz nawet dynamicznie usuwać klucze:
Demo w Babel REPL
Źródło:
źródło
_
dozwolonej zmiennej, której nie zamierzasz używać?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Dla tych, którzy nie mogą korzystać z ES6, możesz użyć
lodash
lubunderscore
.Lub
ramda
.źródło
_.omit(x, 'b')
delete
.Używam tej wkładki ESNext
Jeśli potrzebujesz funkcji ogólnego przeznaczenia:
źródło
map
możesz zrobić:(({b, c, ...others}) => ({...others}))(obj)
Możesz napisać dla niego prostą funkcję pomocniczą. Lodash ma podobną funkcję o tej samej nazwie: pomiń
Pamiętaj też, że jest szybszy niż Object.assign, a następnie usuń: http://jsperf.com/omit-key
źródło
Może coś takiego:
Czy to wystarczy? A może nie można
c
go skopiować?źródło
Korzystanie z destrukcji obiektów
źródło
_
nie rozwiązuje problemu dla ESLint ...Hej, wygląda na to, że napotykasz problemy, gdy próbujesz skopiować obiekt, a następnie usunąć właściwość. Gdzieś trzeba przypisać prymitywne zmienne, aby javascript tworzył nową wartość.
To była prosta sztuczka (może być przerażająca)
źródło
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Nawet nie musisz go usuwać, wystarczy wartość falsy.Oto opcja pominięcia kluczy dynamicznych, które moim zdaniem nie zostały jeszcze wspomniane:
removeMe
jest aliasowanyremovedKey
i ignorowany.newObj
staje się{ 2: 2, 3: 3, 4: 4 }
. Zauważ, że usunięty klucz nie istnieje, wartość nie została tylko ustawiona naundefined
.źródło
źródło
Lodash pomiń
źródło
W tym celu możesz również użyć operatora rozprzestrzeniania
źródło
copy
const copy = { ...source, b: undefined }
sprowadza się do dokładnie tego samego.Powyższe rozwiązania wykorzystujące strukturalizację cierpią na to, że masz używaną zmienną, co może powodować skargi ze strony ESLint, jeśli z niej korzystasz.
Oto moje rozwiązania:
Na większości platform (oprócz IE, chyba że używasz Babel), możesz także:
źródło
Co powiesz na to:
źródło
Jeśli masz do czynienia z dużą zmienną, nie chcesz jej kopiować, a następnie usuwać, ponieważ byłoby to nieefektywne.
Prosta pętla for z funkcją hasOwnProperty powinna działać i jest o wiele bardziej przystosowalna do przyszłych potrzeb:
źródło
A co z tym? Nigdy nie znalazłem tego tupotu, ale próbowałem po prostu wykluczyć jedną lub więcej właściwości bez potrzeby tworzenia dodatkowego obiektu. Wydaje się, że to działa, ale są pewne skutki uboczne, których nie jestem w stanie zobaczyć. Na pewno nie jest bardzo czytelny.
źródło
Dokonałem tego w ten sposób, jako przykład z mojego reduktora Redux:
Innymi słowy:
źródło
const { [removeMe]: removedKey, ...newObj } = obj;
- patrz moja odpowiedź na to pytanie.Ostatnio zrobiłem to w bardzo prosty sposób:
wystarczy użyć operatora rozkładania, aby oddzielić niepożądaną właściwość:
... i object.ignign, aby wziąć tylko część „odpoczynku”:
źródło
rest
jest już nowym obiektem - nie potrzebujesz ostatniej linii. Ponadto jest to identyczne z przyjętym rozwiązaniem.źródło