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
});
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;
}
});
_.compact
. Usunie właściwości, a nie utworzy płytki klon tylko z prawdziwymi wartościami. Zobacz stackoverflow.com/a/19750822/465684 poniżej
delete
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
:
_.pick(sourceObj, _.identity)
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.
pick _.pick (obiekt, * klucze)
Zwróć kopię obiektu , przefiltrowaną, aby zawierała tylko wartości dla kluczy z białej listy (lub tablicy prawidłowych kluczy). Alternatywnie akceptuje predykat wskazujący, które klucze wybrać.
_.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.
_.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, gdy arr.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
_.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;});
_.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.
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;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy(object)
to wszystko, czego potrzebujesz
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
.keys
i .forEach
.
forEach
metody JS
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'
// }
// }
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.
w lodash robisz to tak:
_.pickBy(object, _.identity);
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.