Jaki jest najlepszy sposób konwersji:
['a','b','c']
do:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
David Hellsing
źródło
źródło
_.keyBy
(dawniej_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Np .:var myObj = _.toPlainObject(myArr)
Odpowiedzi:
ECMAScript 6 wprowadza łatwą do wielokrotnego napełniania
Object.assign
:Własna
length
właściwość tablicy nie jest kopiowana, ponieważ nie można jej wyliczyć.Możesz także użyć składni spreadu ES6, aby osiągnąć ten sam wynik:
źródło
{ ...[sortedArray]}
Dzięki takiej funkcji:
Twoja tablica jest już mniej więcej obiektem, ale tablice mają pewne „interesujące” i specjalne zachowanie w odniesieniu do właściwości o nazwach całkowitych. Powyższe da ci prosty przedmiot.
edytuj och też możesz chcieć uwzględnić „dziury” w tablicy:
W nowoczesnych środowiskach wykonawczych JavaScript możesz użyć
.reduce()
metody:Ten pozwala także uniknąć „dziur” w tablicy, ponieważ tak to
.reduce()
działa.źródło
[]
), jeśli nie zamierzasz używać liczbowych kluczy właściwości i właściwości „length”.const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Możesz użyć akumulatora aka
reduce
.Podaj pusty obiekt
{}
jako punkt początkowy; następnie „powiększaj” ten obiekt stopniowo. Pod koniec iteracjiresult
będzie{"0": "a", "1": "b", "2": "c"}
Jeśli tablica jest zbiorem obiektów pary klucz-wartość:
będzie produkować:
{a: 1, b: 2, c: 3}
Ze względu na kompletność,
reduceRight
możesz iterować po tablicy w odwrotnej kolejności:będzie produkować:
{c:3, b:2, a:1}
Twój akumulator może być dowolnego rodzaju do określonego celu. Na przykład, aby zamienić klucz i wartość obiektu w tablicy, przekaż
[]
:będzie produkować:
[{1: "a"}, {2: "b"}, {3: "c"}]
W przeciwieństwie do
map
,reduce
nie może być stosowany jako mapowanie 1-1. Masz pełną kontrolę nad elementami, które chcesz uwzględnić lub wykluczyć. Dlategoreduce
pozwala osiągnąć tofilter
, co czyni, co czynireduce
bardzo wszechstronnym:będzie produkować:
[{2: "b"}, {3: "c"}]
Uwaga :
reduce
iObject.key
są częściąECMA 5th edition
; powinieneś dostarczyć polifill dla przeglądarek, które ich nie obsługują (zwłaszcza IE8).Zobacz domyślną implementację Mozilli .
źródło
Jeśli używasz jquery:
źródło
{0: 'a', 1: 'b', 2: 'c'}
oczekiwanym rezultatem.Dla kompletności, rozpowszechnianie ECMAScript 2015 (ES6). Będzie wymagał transpilatora (Babel) lub środowiska z co najmniej ES6.
źródło
Prawdopodobnie napisałbym to w ten sposób (ponieważ bardzo rzadko nie będę mieć pod ręką biblioteki underscorejs):
źródło
obj=_.extend({},a);
zrobiłby to zadanie. Ponadto, jeśli iterujesz przez tablice, powiedziałbym, że_.each
byłoby bardziej odpowiednie niż_.map
. Podsumowując, nie jest to dobra odpowiedź na kilku poziomach.Oto metoda O (1) ES2015 tylko dla kompletności.
źródło
length
własności. (3) element jest jeszcze tablicąArray.isArray(arr) === true
. (4) Specjalne zachowania tablicowe nie są usuwane, np.arr.length = 0
Usuwa wszystkie indeksy. (5) Dlatego myślę, żeObject.assign
jest znacznie lepszy .Array.isArray
wraca tutajtrue
po „przedmiot”, chociażinstanceof Array
nie ...Zaskoczony nie widzieć -
źródło
{ "first":"a", "second":"b","third":"c" }
z naprawionymi kluczami - Szukam zniszczeniamożemy użyć funkcji
Object.assign
iarray.reduce
przekonwertować tablicę na obiekt.źródło
Skończyło się na użyciu operatora rozprzestrzeniania obiektów, ponieważ jest on częścią standardu ECMAScript 2015 (ES6).
Jako przykład podałem następujące skrzypce .
źródło
Prostym sposobem we współczesnym JavaScript jest użycie,
Object.assign()
które nie robi nic poza kopiowaniem klucza: wartości z jednego obiektu do drugiego. W naszym przypadkuArray
przekazuje nieruchomości na nowy{}
.źródło
O.assign
ale brakowało wyjaśnienia. Obecnie{...array}
W przypadku ES2016 operator rozkładania dla obiektów. Uwaga: dzieje się to po ES6, więc transpiler będzie musiał zostać dostosowany.
źródło
Pięć lat później jest dobry sposób :)
Object.assign
został wprowadzony w ECMAScript 2015.źródło
Za pomocą
javascript#forEach
jednego można to zrobićZ ECMA6:
źródło
FWIW, jednym z ostatnich ostatnich podejść jest użycie nowego
Object.fromEntries
wraz zObject.entries
następującymi:... co pozwala uniknąć przechowywania rzadkich elementów tablicy jako
undefined
lubnull
i zachowuje klucze nieindeksowane (np. nie dodatnie liczby całkowite / nienumeryczne).Można
arr.length
jednak dodać , ponieważ nie jest to uwzględnione:źródło
możesz użyć operatora rozprzestrzeniania
źródło
Jeśli używasz ES6, możesz użyć Object.assign i operatora rozkładania
Jeśli masz zagnieżdżoną tablicę jak
źródło
new Map([['key1', 'value1'], ['key2', 'value2']]);
Szybki i brudny:
źródło
{0:"c", 1:"b", 2:"a"}
. Możeszunshift
zamiast tegopop
lub (lepiej) zacząć odi=arr.length-1
i zamiast tego zmniejszyć.l = arr.length
, a potemwhile (l && (obj[--l] = arr.pop())){}
(zdaję sobie sprawę, że to jest stare, ale dlaczego nie uprościć go jeszcze bardziej).Szybki i brudny # 2:
źródło
i < a.length
zamiasta[i]
.Od Lodash 3.0.0 możesz używać _.toPlainObject
źródło
Oto funkcja rekurencyjna, którą właśnie napisałem. To proste i działa dobrze.
Oto przykład ( jsFiddle ):
Wyniki:
źródło
['a' = '1', 'b' = '2', 'c' = '3']
i chcesz, żeby{a: 1, b: 2, c: 3}
to działało idealnie.[dokumenty]
lub bardziej szczegółowe
lub
najkrótszy z waniliowym JS
bardziej złożony przykład
jeszcze krótszy (przy użyciu
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ docs]
źródło
[/docs]
? Przydałoby się uczynienie fragmentów kodu wykonywalnymi.Zrobiłbym to po prostu
Array.of()
. Tablica ma możliwość wykorzystania kontekstu jako konstruktora.Możemy więc powiązać
Array.of()
się z funkcją i wygenerować obiekt podobny do tablicy.Korzystając z niej
Array.of()
można nawet dokonać podklasowania tablicy .źródło
Jeśli możesz użyć
Map
lubObject.assign
, jest to bardzo łatwe.Utwórz tablicę:
Poniżej utworzono obiekt z indeksem jako kluczami:
Powtórz to samo co powyżej w Mapach
Konwertuje na obiekt oparty na indeksie
{0 : 'css'}
itp ...Konwertuj na obiekt oparty na wartości
{css : 'css is great'}
itp ...źródło
Prosta i bezczelna metoda szybkiego konwertowania tablicy przedmiotów na obiekt
Więc używaj go tak ...
Wynik:
Sprawdzanie typu:
I rzeczy nie byłyby kompletne, gdyby nie było prototypowej metody
Za pomocą:
Wynik:
* UWAGA: nie ma procedury nazewnictwa, więc jeśli chcesz mieć określone nazwy, musisz kontynuować korzystanie z istniejących metod poniżej.
Starsza metoda
Umożliwia to generowanie z tablicy obiektu z kluczami zdefiniowanymi w żądanej kolejności.
console.log(">>> :" + result.onion);
wyświetli „malować”, funkcja musi mieć tablice o równej długości lub otrzymasz pusty obiekt.Oto zaktualizowana metoda
źródło
Albo użyj
źródło
ES5 - Rozwiązanie:
Za pomocą prototypowej funkcji Array „push” i „Apply” można wypełnić obiekt elementami tablicy.
źródło
{ name: a, div :b, salary:c}
Więcej obsługiwanych przeglądarek i bardziej elastyczny sposób korzystania z normalnej pętli , na przykład:
Ale również nowoczesnym sposobem może być użycie operatora rozprzestrzeniania , takiego jak:
Lub Przypisanie obiektu :
Oba powrócą :
źródło
Możesz użyć takiej funkcji:
Ten powinien efektywniej obsługiwać rzadkie tablice.
źródło
Oto rozwiązanie w coffeescript
źródło
obj[i] = v for v,i in arr when v?