Powiedzmy, że mam obiekt:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Chcę utworzyć inny obiekt, filtrując obiekt powyżej, więc mam coś takiego.
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Szukam czystego sposobu na osiągnięcie tego za pomocą Es6, więc operatorzy rozprzestrzeniania są dla mnie dostępni.
filter
ecmascript-6
29er
źródło
źródło
Odpowiedzi:
Jeśli masz listę dozwolonych wartości, możesz łatwo zachować je w obiekcie, używając:
Wykorzystuje to:
Object.keys
aby wyświetlić wszystkie właściwości wraw
(oryginalne dane), a następnieArray.prototype.filter
wybierz klucze znajdujące się na liście dozwolonych, używającArray.prototype.includes
aby upewnić się, że są obecniArray.prototype.reduce
zbudować nowy obiekt z tylko dozwolonymi właściwościami.Spowoduje to utworzenie płytkiej kopii z dozwolonymi właściwościami (ale nie skopiuje samych właściwości).
Możesz także użyć operatora rozkładania obiektów, aby utworzyć serię obiektów bez ich mutowania (dzięki rjerue za wspomnienie o tym ):
Na potrzeby ciekawostek, jeśli chcesz usunąć niechciane pola z oryginalnych danych (czego nie poleciłbym robić, ponieważ wiąże się to z brzydkimi mutacjami), możesz odwrócić
includes
kontrolę w następujący sposób:Podaję ten przykład, aby pokazać rozwiązanie oparte na mutacjach, ale nie sugeruję, aby go używać.
źródło
Array.prototype.includes
nie jest częścią ES6. Został wprowadzony w ECMAScript 2016 (ES7).Jeśli nie masz nic przeciwko korzystaniu ze składni ES6, uważam, że to najczystszy sposób, aby to zrobić, jak zauważono tutaj i tutaj :
Teraz
newData
zawiera:Lub, jeśli klucz jest przechowywany jako ciąg:
W tym drugim przypadku
[key]
jest konwertowany,item2
ale ponieważ używaszconst
przypisania, musisz podać nazwę przypisania._
reprezentuje wartość wyrzucania.Bardziej ogólnie:
To nie tylko zmniejsza twoją operację do jednej linijki, ale także nie wymaga znajomości innych kluczy (tych, które chcesz zachować).
źródło
_
reprezentuje wartość odrzucenia” skąd to się bierze? Pierwszy raz to widzę_
to po prostu poprawna nazwa zmiennej, która może być używana w JS, ale ponieważ jest prawie bezimienna, naprawdę nie powinna być używana w ten sposób, jeśli chcesz przekazać zamiar. Został więc przyjęty jako sposób na oznaczenie zmiennej, na której ci nie zależy. Oto dalsza dyskusja na ten temat: stackoverflow.com/questions/11406823/...filter
ireduce
._
nie ma znaczenia, to tylko zmienna nazwa, możesz zmienić jej nazwę na dowolnąomit
funkcji lodash : lodash.com/docs/4.17.10#omit lub jednego z innych podanych tutaj rozwiązań.Najczystszym sposobem jest znalezienie Lodash # pick
źródło
Nic, co nie zostało powiedziane wcześniej, ale połączenie kilku odpowiedzi z ogólną odpowiedzią ES6:
źródło
To kolejne rozwiązanie w jednej linii Modern JS bez zewnętrznych bibliotek .
Bawiłem się funkcją „ Destrukturyzacja ”:
źródło
var myNewRaw = (({ item1, item3}) => ({ item1, item3 }))(raw);
Problem zeMożesz teraz uczynić go krótszym i prostszym za pomocą metody Object.fromEntries (sprawdź obsługę przeglądarki):
czytaj więcej o: Object.fromEntries
źródło
Możesz dodać ogólny
ofilter
(zaimplementowany z ogólnymoreduce
), aby łatwo filtrować obiekty w taki sam sposób, jak tablice -Widzimy, że działa tutaj -
Sprawdź wyniki we własnej przeglądarce poniżej -
Pokaż fragment kodu
Te dwie funkcje można zaimplementować na wiele sposobów. Zdecydowałem się dołączyć do
Array.prototype.reduce
środka,oreduce
ale równie łatwo można napisać wszystko od zeraźródło
oreduce
, pierwszyacc
jest zasłonięty.reduce(acc, k)
, aofilter
wewnątrzo
zasłonięty -oreduce
nazywany jest również zmienną o nazwieo
- która jest która?ofilter
zmiennejo
jest zacieniony, ale zawsze wskazuje na to samo wejście var; dlatego jest tu zapisywany w tle, ponieważ jest taki sam - akumulator (acc
) jest również zapisywany w tle, ponieważ wyraźniej pokazuje, jak dane przemieszczają się przez lambda;acc
nie zawsze jest tak samo wiążące , ale zawsze reprezentuje bieżący trwały stan wyniku obliczeniowego, który chcemy zwrócićTak to ostatnio zrobiłem:
źródło
Object.assign == ...
Możesz pisaćconst dummyObj = { ...obj }
iconst target = { ...dummyObj }
. Co więcej, to drugie nie jest wcale konieczne, ponieważ później możesz bezpośrednio pracować z dummyObj.ok, a co z tym linkiem
źródło
Odpowiedzi tutaj są zdecydowanie odpowiednie, ale są nieco powolne, ponieważ wymagają zapętlenia białej listy dla każdej właściwości w obiekcie. Poniższe rozwiązanie jest znacznie szybsze w przypadku dużych zestawów danych, ponieważ zapętla się na białej liście tylko raz:
źródło
Piggybacking na odpowiedzi ssube .
Oto wersja wielokrotnego użytku.
Aby to nazwać, użyj
Piękną rzeczą w funkcjach strzałek ES6 jest to, że nie trzeba podawać
allowed
parametru.źródło
Możesz zrobić coś takiego:
Działa to, ale nie jest bardzo jasne, a
with
instrukcja nie jest zalecana ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).źródło
Zamiast tego
filter
można uzyskać prostsze rozwiązanie bez użyciaObject.entries()
Object.keys()
źródło
Istnieje wiele sposobów na osiągnięcie tego. W zaakceptowanej odpowiedzi zastosowano podejście Keys-Filter-Reduce, które nie jest najbardziej wydajne.
Zamiast tego użyj
for...in
pętli, aby przejść przez klucze obiektu lub pętli przez dozwolone klucze, i następnie tworzenia nowego obiektu wynosi około 50% bardziej wydajnych się .za. Widzieć jsPerf, aby zapoznać się z testami prostego przypadku użycia. Wyniki będą się różnić w zależności od przeglądarki.
źródło
Możesz usunąć klucz specjalny ze swojego obiektu
źródło
źródło
Prosta droga! Aby to zrobić
źródło
Inne rozwiązanie wykorzystujące „nową”
Array.reduce
metodę:Demonstracja w tym skrzypcach ...
Ale podoba mi się rozwiązanie w tej odpowiedzi, które używa i :
Object.fromEntries
Array.filter
Array.includes
Demonstracja w tym skrzypcach ...
źródło
OK, a co z tym:
i nazwij to tak:
źródło
Ta funkcja będzie filtrować obiekt na podstawie listy kluczy, co jest bardziej wydajne niż poprzednia odpowiedź, ponieważ nie musi on używać Array.filter przed wywołaniem redukcji. więc jego O (n) w przeciwieństwie do O (n + filtrowane)
źródło
Podczas pętli nic nie zwraca, gdy napotkamy określone właściwości / klucze, i kontynuuj z resztą:
źródło
Dziwi mnie, że nikt jeszcze tego nie sugerował. Jest bardzo czysty i bardzo precyzyjnie określa, które klucze chcesz zachować.
Lub jeśli chcesz mieć brudną wkładkę:
źródło
Innym podejściem byłoby użycie
Array.prototype.forEach()
jakoZawiera wartości tylko tych kluczy, które są dostępne w surowych danych, co zapobiega dodawaniu niepotrzebnych danych.
źródło
To byłoby moje rozwiązanie:
źródło