Mam obiekt JavaScript, taki jak:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Jak usunąć wszystkie niezdefiniowane właściwości? Fałszywe atrybuty powinny pozostać.
javascript
object
lodash
JLavoie
źródło
źródło
_.pickBy(obj, _.identity);
false
VALUMożna po prostu łańcuch
_.omit()
z_.isUndefined
i_.isNull
kompozycje, a otrzymasz wynik z oceny leniwy.Próbny
Aktualizacja z 14 marca 2016 r . :
Jak wspomnieli dylanci w sekcji komentarzy, powinieneś używać
_.omitBy()
funkcji, ponieważ używa ona predykatu zamiast właściwości. Powinieneś użyć tego dla wersji lodash4.0.0
i nowszych.PRÓBNY
Aktualizacja z 1 czerwca 2016 r . :
Jak skomentował Max Truxa , lodash dostarczył już alternatywę
_.isNil
, która sprawdza zarówno, jaknull
iundefined
:źródło
omitBy
funkcji zamiastomit
. A więc_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
zamiast łańcuchów_.isUndefined
i_.isNull
. To czyni go jeszcze krótszym:var result = _.omitBy(my_object, _.isNil);
omitBy
jest mniej wydajny niżpickBy
, więc ten drugi powinien być preferowany, a warunek w funkcji iteracyjnej odwrócony. Przyjęta powyżej odpowiedź jest właściwa.null
iundefined
wartości.identity
Orzecznik usunie równieżfalse
wartości, więc jeśli po prostu opiera się na pytaniu za intencją wtedy nie widzę problemu z moją odpowiedź. Dodatkowo, jeśli zajmujemy się „wydajnością”,omitBy
po prostu domyślnie wywołujepickBy
z zanegowanymidentity
predykatem. Więc jeśli chodzi o wydajność, jest zbyt mały, aby był znaczący.jeśli używasz lodash, możesz użyć
_.compact(array)
do usunięcia wszystkich fałszywych wartości z tablicy.https://lodash.com/docs/4.17.4#compact
źródło
_.pickBy(object, _.isNumber)
w takim przypadku.Poprawna odpowiedź to:
Skutkuje to:
Alternatywa podana tutaj przez inne osoby:
Usunie również
false
wartości, które nie są tutaj pożądane.źródło
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, object.bb
, 'c' nie zostanie usuniętyWłaśnie:
Powyższe nie bierze pod uwagę
null
wartości, ponieważ brakuje ich w oryginalnym przykładzie i wspomniane tylko w temacie, ale zostawiam to, ponieważ jest eleganckie i może mieć swoje zastosowania.Oto kompletny przykład, mniej zwięzły, ale bardziej kompletny.
źródło
_.omitBy
.Aby uzupełnić inne odpowiedzi, w lodash 4, aby zignorować tylko undefined i null (a nie właściwości takie jak
false
), możesz użyć predykatu w_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Przykład poniżej:
źródło
0
,''
,false
wartości. Możesz także skrócić oddzwanianie dov => v != null
.Według lodash Docs:
Możesz także odfiltrować wszystkie wartości null
źródło
W przypadku głęboko zagnieżdżonych obiektów możesz użyć mojego fragmentu dla lodash> 4
źródło
Napotkałem podobny problem z usuwaniem
undefined
z obiektu (głęboko) i stwierdziłem, że jeśli możesz przekonwertować zwykły stary obiekt i użyć JSON, szybka i brudna funkcja pomocnicza wyglądałaby tak:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
„... Jeśli podczas konwersji napotkana zostanie funkcja lub symbol, który jest niezdefiniowany, jest on albo pomijany (gdy zostanie znaleziony w obiekcie), albo ocenzurowany do wartości null (gdy zostanie znaleziony w tablicy)."
źródło
z czystym JavaScript: (chociaż Object.entries to ES7, Object. assign to ES6; ale odpowiednik ES5 używa tylko Object.keys, powinno być również możliwe); zwróć także uwagę na
v != null
sprawdzanie zarówno wartości zerowej, jak i niezdefiniowanej;Edycja: poniżej znajduje się wersja z ES5 Object.keys: ale ogólnie z ES7 w Node v8 jest całkiem przyjemna ;-)
Aktualizacja w październiku 2017 r . : w Node v8 (od wersji 8.3 lub podobnej) ma teraz konstrukcję rozprzestrzeniania obiektów:
lub tylko w ramach jednej obniżki:
Aktualizacja: ktoś chce rekurencyjny? też nie jest to trudne, po prostu potrzebuję dodatkowego sprawdzenia isObject i rekurencyjnie wywołuj siebie:
mój wniosek: jeśli wystarczy czysty Javascript, unikałbym wszelkich zależności bibliotek innych firm:
źródło
Ponieważ niektórzy z was mogliby dojść do pytania, które dotyczy tylko usunięcia
undefined
, możesz użyć:połączenie metod Lodash
rundef
Pakiet, który usuwa tylkoundefined
właściwościJeśli chcesz rekurencyjnie usunąć
undefined
właściwości,rundef
pakiet ma równieżrecursive
opcję.Więcej informacji można znaleźć w dokumentacji .
źródło
Oto podejście, które obrałbym:
Funkcja pairs () zamienia obiekt wejściowy w tablicę tablic klucz / wartość. Robisz to, aby łatwiej było używać odrzucania () do eliminowania
undefined
inull
wartości. Następnie pozostają pary, które nie zostały odrzucone, a te są danymi wejściowymi dla zipObject () , który rekonstruuje dla Ciebie obiekt.źródło
Biorąc pod uwagę, że
undefined == null
możemy napisać następująco:Przykład JSBin
źródło
pickBy domyślnie używa tożsamości :
źródło
Najkrótsza droga (lodash v4):
źródło
Z lodash (lub podkreśleniem) Możesz to zrobić
W przeciwnym razie za pomocą waniliowego JavaScript możesz to zrobić
Nie używać testu falsey, ponieważ nie tylko „undefined” lub „null” zostanie odrzucone , ale także inne wartości falsey, takie jak „false”, „0”, pusty ciąg, {}. Dlatego, aby uczynić to prostym i zrozumiałym, zdecydowałem się użyć wyraźnego porównania, jak zakodowano powyżej.
źródło
Aby pominąć wszystkie wartości falsey , ale zachować wartości logiczne, to rozwiązanie pomaga.
źródło
źródło
Użyłbym podkreślenia i zadbałbym też o puste ciągi:
jsbin .
źródło
Dla głęboko zagnieżdżonych obiektów i tablic. i wyklucz puste wartości z string i NaN
wynik:
źródło
Lubię używać _.pickBy, ponieważ masz pełną kontrolę nad tym, co usuwasz:
Źródło: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
źródło
Dla tych z was, którzy chcą usunąć z tablicy obiektów i użyć lodash, mogą zrobić coś takiego:
Uwaga: nie musisz niszczyć, jeśli nie chcesz.
źródło