W jaki sposób można przekształcić wielkim object
aby array
z lodash?
var obj = {
22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}
// transform to
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]
javascript
arrays
object
lodash
siavolt
źródło
źródło
Odpowiedzi:
Możesz to zrobić
Dokumentację można znaleźć tutaj.
źródło
id
nieruchomość nie istnieje i chcesz ją utworzyć na podstawie klucza każdego obiektu.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
return
wartość do tablicy takiej jak ta:const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });
Byłbym wdzięczny za wszelkie komentarze lub sugestie dotyczące ulepszenia tego podejścia.const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
Wyniki jako:
źródło
toArray
razie potrzeby nie ma sposobu, aby zachować klucze.Nowoczesne natywne rozwiązanie, jeśli ktoś jest zainteresowany:
lub (nie IE):
źródło
Object.keys(obj).map(key=>({key,value: obj[key]}))
const arr = Object.keys(obj).map(id => ({ id, ...obj[id] }));
spowodowałoby to przeniesienie całego obiektu do zwróconych danych nie? (używając 'id', ponieważ pierwotny pytający chciał przechowywać swój klucz jako rekwizyt id)U mnie to zadziałało:
Skręca, zakręca
w
źródło
_.map(data, (v,k)=>({[k]: v}))
zobacz moją odpowiedź po szczegóły._.toPairs
i_fromPairs
jest tutaj dodatkowy i niepotrzebny.[{key: 'someKey', val: 'The value'}, {....},...]
Istnieje kilka sposobów na osiągnięcie pożądanego rezultatu. Podzielmy je na kategorie:
Tylko wartości ES6 :
Główną metodą jest Object.values . Ale używając Object.keys i Array.map , równie dobrze możesz uzyskać oczekiwany wynik:
Pokaż fragment kodu
Klucz i wartość ES6 :
Używając map i ES6 dynamicznych / obliczonych właściwości i destrukturyzacji , możesz zachować klucz i zwrócić obiekt z mapy.
Pokaż fragment kodu
Tylko wartości Lodash :
Metoda zaprojektowana do tego jest
_.values
jednak „skróty”, jak_.map
i metoda narzędziowa,_.toArray
która również zwraca tablicę zawierającą tylko wartości z obiektu. Możesz również skorzystać_.map
z_.keys
i pobrać wartości z obiektu przy użyciuobj[key]
notacji.Uwaga:
_.map
przekazany obiekt użyłby swojego programubaseMap
obsługi, który jest w zasadzieforEach
na właściwościach obiektu.Pokaż fragment kodu
Klucz i wartość Lodash :
Pokaż fragment kodu
Należy zauważyć, że w powyższych przykładach używany jest ES6 (funkcje strzałkowe i właściwości dynamiczne). Możesz użyć lodash
_.fromPairs
i innych metod do komponowania obiektu, jeśli problemem jest ES6.źródło
Jeśli chcesz, aby klucz (w tym przypadku id) został zachowany jako właściwość każdego elementu tablicy, możesz to zrobić
źródło
Aktualizacja 2017: Object.values , lodash values i toArray . Aby zachować mapę klawiszy i rozłożyć operator, graj dobrze:
źródło
Przekształcanie obiektu w tablicę za pomocą zwykłego kodu JavaScript (
ECMAScript-2016
)Object.values
:Jeśli chcesz również zachować klucze, użyj
Object.entries
i wArray#map
ten sposób:źródło
var arr = _.map(obj)
Możesz również użyć
_.map
funkcji (zarównolodash
iunderscore
) z,object
jak również, będzie ona wewnętrznie obsługiwać ten przypadek, iterować po każdej wartości i kluczu za pomocą iteracji, a na koniec zwróci tablicę. W rzeczywistości możesz go używać bez iteracji (po prostu_.map(obj)
), jeśli potrzebujesz tylko tablicy wartości. Zaletą jest to, że jeśli potrzebujesz jakiejkolwiek transformacji pomiędzy, możesz to zrobić za jednym razem.Przykład:
Pokaż fragment kodu
Jeśli jednak chcesz przekształcić swój obiekt, możesz to zrobić, nawet jeśli chcesz zachować klucz, możesz to zrobić (
_.map(obj, (v, k) => {...}
) z dodatkowym argumentem in,map
a następnie użyć go tak, jak chcesz.Istnieją jednak inne rozwiązania Vanilla JS do tego (jak każde
lodash
rozwiązanie powinno mieć czystą wersję JS), takie jak:Object.keys
a potemmap
je wartościomObject.values
(w ES-2017)Object.entries
a następniemap
każda para klucz / wartość (w ES-2017)for...in
pętli i użyj każdego klucza do pobierania wartościI dużo więcej. Ale ponieważ to pytanie jest dla
lodash
(i zakładając, że ktoś już go używa), nie musisz dużo myśleć o wersji, obsłudze metod i obsłudze błędów, jeśli te nie zostaną znalezione.Istnieją inne rozwiązania lodash, takie jak
_.values
(bardziej czytelne dla określonego celu) lub pobieranie par, a następnie mapowanie i tak dalej. ale w przypadku, gdy kod wymaga elastyczności, aby można go było zaktualizować w przyszłości, ponieważ trzebakeys
nieco zachować lub przekształcić wartości, najlepszym rozwiązaniem jest użycie pojedynczego_.map
adresu jako adresu w tej odpowiedzi. Nie będzie to takie trudne, jak na czytelność.źródło
Obiekt do tablicy
Ze wszystkich odpowiedzi myślę, że ta jest najlepsza:
to zmienia:
do:
Array to Object
Aby przekształcić z powrotem:
Aby przekształcić z powrotem, zachowując klucz w wartości:
Da:
W ostatnim przykładzie możesz również użyć lodash
_.keyBy(arr, 'key')
lub_.keyBy(arr, i => i.key)
.źródło
Jeśli chcesz trochę niestandardowego mapowania (na przykład oryginalnego Array.prototype.map) obiektu na tablicę, możesz po prostu użyć
_.forEach
:Zobacz
lodash
dokument _.forEach https://lodash.com/docs/#forEachźródło