Jak mogę usunąć wszystkie atrybuty, które są undefined
lub null
w obiektu JavaScript?
(Pytanie jest podobne do tego dla tablic)
javascript
abhijit
źródło
źródło
Odpowiedzi:
Możesz zapętlić obiekt:
Jeśli obawiasz się, że usunięcie tej właściwości nie uruchamia łańcucha proptype obiektu, możesz również:
Kilka uwag na temat wartości null vs undefined:
źródło
Korzystanie z niektórych ES6 / ES2015 :
1) Prosta jedna linijka do usuwania elementów w linii bez przypisania:
jsbin
2) Ten przykład został usunięty ...
3) Pierwszy przykład napisany jako funkcja:
jsbin
4) Ta funkcja używa rekurencji również do usuwania elementów z zagnieżdżonych obiektów:
jsbin
4b) Jest to podobne do 4), ale zamiast bezpośrednio mutować obiekt źródłowy, zwraca nowy obiekt.
5) Funkcjonalne podejście do 4b) oparte na odpowiedzi @ MichaelJ.Zoidl przy użyciu
filter()
ireduce()
. Ten zwraca również nowy obiekt:jsbin
6) Taki sam jak 4), ale z ES7 / 2016
Object.entries()
.5b) Kolejna funkcjonalna wersja, która wykorzystuje rekurencję i zwraca nowy obiekt z ES2019
Object.fromEntries()
:7) Taki sam jak 4), ale w zwykłym ES5 :
jsbin
źródło
keys
zobject
, więco
ik
są oczywiste. Ale myślę, że to kwestia gustu.Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
Object.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
Jeśli używasz lodash lub underscore.js, oto proste rozwiązanie:
Będzie to działać tylko z lodash 4, pre lodash 4 lub underscore.js, użyj
_.pick(obj, _.identity)
;źródło
_.omit(obj, _.isUndefined)
jest lepsze._.isUndefined
nie pomija zer , użyj,_.omitBy(obj, _.isNil)
aby pominąć obaundefined
inull
Najkrótsza jedna wkładka do ES6 +
Odfiltrować wszystkie wartości falsy (
""
,0
,false
,null
,undefined
)Filtr
null
iundefined
wartości:Filtruj TYLKO
null
Filtruj TYLKO
undefined
Rozwiązania rekurencyjne: filtry
null
iundefined
W przypadku obiektów:
W przypadku obiektów i tablic:
źródło
v == null
, sprawdzisz przeciwkoundefined
inull
.cleanEmpty
rozwiązania recursve zwróci pusty obiekt{}
dla obiektów DateJeśli ktoś potrzebuje rekurencyjnej wersji odpowiedzi Owena (i Erica), oto:
źródło
hasOwnProperty
używaif(test.hasOwnProperty(i)) { ... }
JSON.stringify usuwa niezdefiniowane klucze.
źródło
null
być traktowany jakundefined
skorzystaj z funkcji zastępowania, więcej informacji znajdziesz w tej odpowiedzi: stackoverflow.com/questions/286141/...null
wartości. Spróbuj:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
a potemconsole.log(removeUndefined(a))
. Pytanie dotyczyłoundefined
inull
wartości.Prawdopodobnie szukasz
delete
słowa kluczowego.źródło
Najprostsze możliwe rozwiązanie Lodash, aby zwrócić obiekt z odfiltrowanymi wartościami
null
iundefined
._.omitBy(obj, _.isNil)
źródło
Możesz użyć kombinacji
JSON.stringify
parametru zastępującego iJSON.parse
przekształcić go z powrotem w obiekt. Użycie tej metody oznacza również zastąpienie wszystkich zagnieżdżonych kluczy w zagnieżdżonych obiektach.Przykładowy obiekt
Funkcja zamiennika
Oczyść obiekt
Przykład CodePen
źródło
Korzystanie ramda # pickBy można zdjąć
null
,undefined
afalse
wartości:Jak wskazał @manroe, aby zachować
false
wartości, użyjisNil()
:źródło
(v) => !R.isNil(v)
jest prawdopodobnie lepszym wyborem dla pytania OP, biorąc pod uwagę, żefalse
lub inne wartości fałszowania również zostałyby odrzucone przezR.identity
Funkcjonalne i niezmienne podejście,
.filter
bez tworzenia i tworzenia większej liczby obiektów niż potrzebaźródło
obj[key] === undefined
naobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
możesz zrobić krócej z
!
warunkiemZapamiętaj w użyciu: jak @semicolor ogłasza w komentarzach: Spowoduje to również usunięcie właściwości, jeśli wartość jest pustym ciągiem, fałszem lub zerem
źródło
[null, undefined].includes(r[k])
zamiast!r[k]
.Krótsze rozwiązanie ES6 pure, przekonwertuj je na tablicę, użyj funkcji filtrowania i przekonwertuj z powrotem na obiekt. Łatwo byłoby również wykonać funkcję ...
Btw. dzięki temu
.length > 0
sprawdzam, czy jest pusty ciąg / tablica, więc usunie puste klucze.JS BIN https://jsbin.com/kugoyinora/edit?js,console
źródło
null
iundefined
łatwiej byłoby po prostu użyćMY_OBJECT[f] != null
. Twoje obecne rozwiązanie usuwa wszystko oprócz niepustych ciągów / list i generuje błąd, gdy wartości sąnull
filter
, byłoby bardziej czytelne.omit
, musisz sprawdzić obj istnieje przed wywołaniemObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Możesz wykonać rekurencyjne usuwanie w jednym wierszu, używając argumentu zamiennika json.stringify
Stosowanie:
Jak wspomniano w komentarzu Emmanuela, ta technika działała tylko wtedy, gdy struktura danych zawiera tylko typy danych, które można umieścić w formacie JSON (ciągi, liczby, listy itp.).
(Ta odpowiedź została zaktualizowana do korzystania z nowego operatora Nullish koalescencyjny w zależności od potrzeb klientów przeglądarka może chcesz zamiast korzystać z tej funkcji.
(k,v) => v!=null ? v : undefined
)źródło
NaN
nanull
które nie zostaną usunięte.Jeśli chcesz 4 linie czystego rozwiązania ES7:
Lub jeśli wolisz bardziej czytelną wersję:
Pozwoli to zachować wartości logiczne i wyczyści również tablice. Zachowuje również oryginalny obiekt, zwracając oczyszczoną kopię.
źródło
Mam taki sam scenariusz w moim projekcie i został osiągnięty przy użyciu następującej metody.
Działa ze wszystkimi typami danych, kilka wyżej wymienionych nie działa z datą i pustymi tablicami.
removeEmptyKeysFromObject.js
przekazuje dowolny obiekt do tej funkcji removeEmptyKeysFromObject ()
źródło
Do głębokiego wyszukiwania użyłem następującego kodu, być może będzie przydatny dla każdego, kto patrzy na to pytanie (nie jest to przydatne w przypadku cyklicznych zależności):
źródło
Jeśli nie chcesz mutować w miejscu, ale zwrócisz klon z usuniętą wartością null / undefined, możesz użyć funkcji redukcji ES6.
źródło
Zamiast usunąć właściwość, możesz również utworzyć nowy obiekt z kluczami, które nie mają wartości null.
źródło
Aby piggypack na odpowiedź Bena o tym, jak rozwiązać ten problem przy użyciu lodash użytkownika
_.pickBy
, można również rozwiązać ten problem w bibliotece Siostro underscore.js „s_.pick
.Zobacz: Przykład JSFiddle
źródło
pomocnik redukcji może zrobić lewę (bez sprawdzania typu) -
źródło
Jeśli ktoś musi usunąć
undefined
wartości z obiektu za pomocą głębokiego wyszukiwania,lodash
oto kod, którego używam. Bardzo łatwo go zmodyfikować, aby usunąć wszystkie puste wartości (null
/undefined
).źródło
Z Lodash:
źródło
Jeśli używasz eslint i chcesz uniknąć wyłączenia reguły no-param-reassign, możesz użyć Object.assign w połączeniu z .reduce i obliczoną nazwą właściwości dla dość eleganckiego rozwiązania ES6:
źródło
Oto funkcjonalny sposób usunięcia
nulls
z obiektu za pomocą ES6 bez mutowania obiektu przy użyciu tylkoreduce
:źródło
stripNulls
funkcji wykorzystuje odwołanie spoza zakresu funkcji akumulatora; a także miesza obawy, filtrując w ramach funkcji akumulatora. 😝 (np.Object.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
) Tak,Możesz także użyć
...
składni spreadu, używającforEach
czegoś takiego:źródło
Wyczyść obiekt na miejscu
Czysta funkcja
źródło
Możemy użyć JSON.stringify i JSON.parse do usunięcia pustych atrybutów z obiektu.
źródło
{} != {}
i[] != []
), ale w innym przypadku poprawne jest podejścieOto kompleksowa funkcja rekurencyjna (pierwotnie oparta na funkcji @chickens), która:
defaults=[undefined, null, '', NaN]
STOSOWANIE:
źródło
Jeśli wolisz podejście czyste / funkcjonalne
źródło