Mam obiekt z kilkoma właściwościami. Chciałbym usunąć wszystkie właściwości, które mają fałszywe wartości.
Można to osiągnąć za compact
pomocą tablic, ale co z obiektami?
Mam obiekt z kilkoma właściwościami. Chciałbym usunąć wszystkie właściwości, które mają fałszywe wartości.
Można to osiągnąć za compact
pomocą tablic, ale co z obiektami?
Odpowiedzi:
Możesz stworzyć własną wtyczkę podkreślenia (mixin):
_.mixin({ compactObject: function(o) { _.each(o, function(v, k) { if(!v) { delete o[k]; } }); return o; } });
A potem użyj go jako natywnej metody podkreślenia:
var o = _.compactObject({ foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined });
Aktualizacja
Jak zauważył @AndreiNeculau , ta mieszanka wpływa na oryginalny obiekt, podczas gdy oryginalna metoda podkreślenia zwraca kopię tablicy . Aby rozwiązać ten problem i sprawić, by nasz zachowywał się bardziej jak kuzyn , oto drobna aktualizacja:
compact
compactObject
_.mixin({ compactObject : function(o) { var clone = _.clone(o); _.each(clone, function(v, k) { if(!v) { delete clone[k]; } }); return clone; } });
źródło
_.compact
. Usunie właściwości, a nie utworzy płytki klon tylko z prawdziwymi wartościami. Zobacz stackoverflow.com/a/19750822/465684 poniżejdelete
jest generalnie odradzane, ponieważ natychmiast ujawnia właściwości o tej samej nazwie z łańcucha prototypów, a także zmniejsza wydajność z powodu „ukrytych klas” (V8) - zmiana struktury obiektu powoduje, że silnik wykonuje dodatkową pracę. Najlepszym i najkrótszym rozwiązaniem byłoby_.pick(o, _.identity)
.Od wersji Underscore 1.7.0 możesz używać
_.pick
:Wyjaśnienie
Drugi parametr
_.pick
może być funkcją predykatu do wybierania wartości. Wartości, dla których predykat zwraca prawdę, są wybierane, a wartości, dla których predykat zwraca fałsz, są ignorowane._.identity
jest funkcją pomocniczą, która zwraca swój pierwszy argument, co oznacza, że działa również jako funkcja predykatu, która wybiera prawdziwe wartości i odrzuca fałszywe. Biblioteka Underscore zawiera również kilka innych predykatów, na przykład_.pick(sourceObj, _.isBoolean)
zachowuje tylko właściwości logiczne.Jeśli często używasz tej techniki, możesz uczynić ją nieco bardziej wyrazistą:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something pickNonfalsy(sourceObj);
Podkreślona wersja 1.6.0 również została udostępniona
_.pick
, ale nie akceptowała funkcji predykatu zamiast białej listy.źródło
_.identity
funkcji, bardzo przydatne._.omit(sourceObj, _.isUndefined)
do usunięcia tylko niezdefiniowanych wartości (dopuszczając false, null, 0).pick(obj, Boolean)
, aby wyeliminować wartości falsey że samo podejście może być stosowane, gdyarr.filter(Boolean)
wyczyścić tablicę z wartościami falsey ..._.pick(sourceObj, prop => prop)
_.pick
działa z nazwami nieruchomości, dla tej funkcji, jak wspomniano w postu_.pickBy
Szybkie i jasne:
_.omitBy( source, i => !i );
Stwierdzono to w sposób odwrotny do odpowiedzi Emila. W ten sposób imho czyta jaśniej; jest to bardziej oczywiste.
Nieco mniej czyste, jeśli nie masz luksusu ES6:
_.omitBy( source, function(i){return !i;});
Alternatywny:
_.omitBy( source, _.isEmpty)
Używanie
_.isEmpty
zamiast_.identity
prawdziwości w wygodny sposób usunie również puste tablice i obiekty z kolekcji i być może niewygodnie usunie liczby i daty . Tak więc wynik NIE jest dokładną odpowiedzią na pytanie PO, jednak może być przydatny przy próbie usunięcia pustych kolekcji.źródło
omitBy
. lodash.com/docs#omitBy_.pick(source, i => i);
co unika negacji_.pickBy(source)
to wszystko, czego potrzeba._.isEmpty(5) === true
. W ten sposób wartości, które są liczbami, zostaną odrzucone.Z transformacją lodash ,
_.transform(obj, function(res, v, k) { if (v) res[k] = v; });
źródło
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy
zamiast_.pick
)_.pickBy(object)
to wszystko, czego potrzebujeszObject.keys(o).forEach(function(k) { if (!o[k]) { delete o[k]; } });
źródło
.keys
i.forEach
.forEach
metody JSMożesz stworzyć płytki klon:
_(obj).reduce(function(a,v,k){ if(v){ a[k]=v; } return a; },{});
źródło
do użytku obiektu usuń.
for(var k in obj){ if(obj.hasOwnProperty(k) && !obj[k]){ delete obj[k]; } }
źródło
Nagle potrzebowałem stworzyć funkcję usuwającą rekurencyjne falsyfikaty. Mam nadzieję, że to pomoże. Używam Lodash.
var removeFalsies = function (obj) { return _.transform(obj, function (o, v, k) { if (v && typeof v === 'object') { o[k] = _.removeFalsies(v); } else if (v) { o[k] = v; } }); }; _.mixin({ 'removeFalsies': removeFalsies });
Następnie możesz go użyć:
var o = _.removeFalsies({ foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined, obj: { foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined } }); // { // foo: 'bar', // obj: { // foo: 'bar' // } // }
źródło
Aby dodać do odpowiedzi gion_13:
_.mixin({ compactObject : function(o) { var newObject = {}; _.each(o, function(v, k) { if(v !== null && v !== undefined) { newObject[k] = v } }); return newObject; } });
Ten tworzy nowy obiekt i dodaje klucze i wartości zamiast klonować wszystko i usuwać pary klucz-wartość. Niewielka różnica.
Ale co ważniejsze, sprawdza jawnie pod kątem wartości null i undefined zamiast falsey, co spowoduje usunięcie par klucz-wartość, które mają wartość false.
źródło
w lodash robisz to tak:
źródło
Chociaż
_.compact
jest udokumentowane do użycia w tablicach. Wydaje się, że działa również w przypadku obiektów. Właśnie uruchomiłem na konsolach Chrome, Opera i Firefox:var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}} undefined _.compact(obj) [1, 3, function()]
UPDATE: Jak wskazuje przykład, wywołanie
_.compact
obiektu spowoduje porzucenie kluczy i zwrócenie skompaktowanej tablicy.źródło