Konwertuj tablicę na obiekt


514

Jaki jest najlepszy sposób konwersji:

['a','b','c']

do:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3
Może potrzebuje tego, żeby jakiś kod piszący na klawiaturze nie myślał, że to instancja Array
Pointy,

6
Warto zauważyć, że tablice JavaScript obiektami.
Spudley,

Jeśli ktoś szuka rozwiązania Lodash, zastanów się _.keyBy(dawniej _.indexBy): lodash.com/docs#keyBy
2540625

Jest to nieco mylące, ponieważ tablice są już obiektami, ale myślę, że sedno pytania polega na przekształceniu tablicy egzotycznego obiektu w zwykły obiekt .
Oriol

1
Prostym sposobem na to z Lodash jest _.toPlainObject. Np .:var myObj = _.toPlainObject(myArr)
Julian Soro

Odpowiedzi:


473

ECMAScript 6 wprowadza łatwą do wielokrotnego napełniania Object.assign:

Object.assign()Sposób jest stosowany w celu skopiowania wartości wszystkich przeliczalnych właściwości własnych od jednego lub większej liczby obiektów źródłowych do obiektu docelowego. Zwróci obiekt docelowy.

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

Własna lengthwł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:

{ ...['a', 'b', 'c'] }

Chciałbym tylko wskazać - jeśli masz już tablicę posortowanych właściwości z oryginalnego obiektu, użycie operatora rozkładania spowoduje, że tablica ta zamieni się bezpośrednio w nowy obiekt:{ ...[sortedArray]}
HappyHands31

Oriol, czy istnieje sposób, aby ustawić stały klucz zamiast 0 i 1?
Menai Ala Eddine

488

Dzięki takiej funkcji:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

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:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

W nowoczesnych środowiskach wykonawczych JavaScript możesz użyć .reduce()metody:

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

Ten pozwala także uniknąć „dziur” w tablicy, ponieważ tak to .reduce()działa.


2
@ m93a to już obiekt. W JavaScript nie ma sensu tworzenie instancji Array ( []), jeśli nie zamierzasz używać liczbowych kluczy właściwości i właściwości „length”.
Pointy

14
czystszy sposób na uniknięcie ponownego przypisania paramconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn

3
Strzałka + składnia destrukcyjna bez wyraźnego powrotu:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib

2
@eugene_sunic rzeczywiście, ale takie podejście nie było dostępne, kiedy odpowiedziałem na to w 2010 roku :)
Pointy

2
Jak wskazuje @miro, tworzenie nowego obiektu za każdym razem nie jest konieczne, a w rzeczywistości znacznie wolniejsze niż manipulowanie początkowym obiektem, który został utworzony. Uruchomienie testu JSPerf na tablicy 1000 elementów, tworzenie nowego obiektu za każdym razem jest 1000 razy wolniejsze niż mutowanie istniejącego obiektu. jsperf.com/…
romellem

281

Możesz użyć akumulatora aka reduce.

['a','b','c'].reduce(function(result, item, index, array) {
  result[index] = item; //a, b, c
  return result;
}, {}) //watch out the empty {}, which is passed as "result"

Podaj pusty obiekt {}jako punkt początkowy; następnie „powiększaj” ten obiekt stopniowo. Pod koniec iteracji resultbędzie{"0": "a", "1": "b", "2": "c"}

Jeśli tablica jest zbiorem obiektów pary klucz-wartość:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  result[key] = item[key];
  return result;
}, {});

będzie produkować: {a: 1, b: 2, c: 3}

Ze względu na kompletność, reduceRightmożesz iterować po tablicy w odwrotnej kolejności:

[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)

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ż []:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  var value = item[key];
  var obj = {};
  obj[value] = key;
  result.push(obj);
  return result;
}, []); //an empty array

będzie produkować: [{1: "a"}, {2: "b"}, {3: "c"}]

W przeciwieństwie do map, reducenie może być stosowany jako mapowanie 1-1. Masz pełną kontrolę nad elementami, które chcesz uwzględnić lub wykluczyć. Dlatego reducepozwala osiągnąć to filter, co czyni, co czyni reducebardzo wszechstronnym:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  if(index !== 0) { //skip the first item
    result.push(item);
  }
  return result;
}, []); //an empty array

będzie produkować: [{2: "b"}, {3: "c"}]

Uwaga : reducei Object.keysą 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 .


1
Pomocne w utrzymaniu sklepu redux, gdy korzystasz z mapy obiektów i musisz upuścić jeden z kluczy
dhruvpatel,

101

Jeśli używasz jquery:

$.extend({}, ['a', 'b', 'c']);

4
Dziwne, jeśli podam zmienną Array, umieści każdy znak w osobnym obiekcie: 0: „a”, 1: „,”, 2: „b” ... Więc ignoruje cudzysłowy, ale zawiera przecinki. .
TrySpace

@Max Myślę, że takie zachowanie nie istnieje. Zwrócony obiekt jest {0: 'a', 1: 'b', 2: 'c'}oczekiwanym rezultatem.
ivkremer

3
Czy istnieje sposób na użycie $ .extend przy jednoczesnym informowaniu kluczy w sposób nienumeryczny, tj .: dokonywanie obliczeń na elementach tablicy?
Davi Lima

super niesamowity i krótki test
Faisal Mehmood Awan

63

Dla kompletności, rozpowszechnianie ECMAScript 2015 (ES6). Będzie wymagał transpilatora (Babel) lub środowiska z co najmniej ES6.

console.log(
   { ...['a', 'b', 'c'] }
)


2
W rzeczywistości nie jest to również natywnie dostępne w ES2015. Jest jednak bardzo elegancki.
Aluan Haddad

47

Prawdopodobnie napisałbym to w ten sposób (ponieważ bardzo rzadko nie będę mieć pod ręką biblioteki underscorejs):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9
głosujesz za moją odpowiedzią, ale bez komentarza? Moja odpowiedź jest poprawna i przetestowana. Jaki jest sprzeciw?
Dave Dopson

14
To pytanie nie ma znacznika podkreślenia i zakładasz także node.js lub wymaganą bibliotekę.
David Hellsing,

10
podkreślenie jest dość powszechne zarówno na kliencie, jak i na serwerze. Zakłada się, że jest to Backbone.js i jest prawdopodobnie NAJCZĘSTSZĄ biblioteką narzędzi. Biorąc to pod uwagę, podałem wiersz wymagający, aby było jasne, że korzystam z biblioteki. Nie ma 1-linijki do opisania „dodaj underscore.js do swojej strony”, więc środowisko przeglądarki wymaga nieco tłumaczenia
Dave Dopson

6
Mimo to, jeśli używasz znaku podkreślenia, prosty obj=_.extend({},a);zrobiłby to zadanie. Ponadto, jeśli iterujesz przez tablice, powiedziałbym, że _.eachbyłoby bardziej odpowiednie niż _.map. Podsumowując, nie jest to dobra odpowiedź na kilku poziomach.
David Hellsing

4
„Musisz odpowiedzieć, nie wspominając o podkreśleniu lub zwariowaniu”, ludzie są bardzo denerwujący. Można to porównać do powiedzenia, że ​​musisz odpowiedzieć na pytania w C ++ bez wspominania o standardowych bibliotekach. Jeśli podkreślenie lub lo-dash nie jest opcją, PO powinien o tym wspomnieć.
Charlie Martin

26

Oto metoda O (1) ES2015 tylko dla kompletności.

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object

(1) Według MDN zmiana [[Prototyp]] obiektu jest bardzo powolną operacją. (2) Nie usuwa to własnej lengthwłasności. (3) element jest jeszcze tablicą Array.isArray(arr) === true. (4) Specjalne zachowania tablicowe nie są usuwane, np. arr.length = 0Usuwa wszystkie indeksy. (5) Dlatego myślę, że Object.assignjest znacznie lepszy .
Oriol

1
@Oriol mdn jest niepoprawny, przynajmniej w V8 (ale także w innych silnikach) jest to dość szybka operacja w tym konkretnym przypadku - ponieważ obiekty mają magazyn numeryczny i tak, to zasadniczo zmienia dwa wskaźniki.
Benjamin Gruenbaum

Można to również wykorzystać, ponieważ jest najwyraźniej unikatowe wśród innych szybkich rozwiązań, polegające na zachowaniu w tablicy dowolnych właściwości nieindeksowanych („własnych”) (tj. Właściwości
nieujemnych

Ale hmm, Array.isArraywraca tutaj truepo „przedmiot”, chociaż instanceof Arraynie ...
Brett Zamir

@BrettZamir, który brzmi jak błąd: D
Benjamin Gruenbaum

26

Zaskoczony nie widzieć -

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)


Wszelkie mądre sugestie, aby utworzyć { "first":"a", "second":"b","third":"c" }z naprawionymi kluczami - Szukam zniszczenia
mplungjan

@mplungjan W tym przypadku sugerowałbym użycie funkcji zmniejsz zamiast przypisać. Prawdopodobnie istnieje biblioteka, która w razie potrzeby pozwala wyliczyć liczbę porządkową.
Wylliam Judd

Miałem dzisiaj inną sprawę. Skończyło się na tym, że zadałem pytanie: stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan

23

możemy użyć funkcji Object.assigni array.reduceprzekonwertować tablicę na obiekt.

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)


Właśnie tego szukałem. Nie potrzebowałem indków, musiałem przekształcić tablicę w zachowane pary klucz-wartość.
Mike K

18

Skończyło się na użyciu operatora rozprzestrzeniania obiektów, ponieważ jest on częścią standardu ECMAScript 2015 (ES6).

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

Jako przykład podałem następujące skrzypce .


1
Nie jestem pewien co do wydajności tego, ale z tak wielu konwersji Array to Object (ponieważ chcę używać obiektów dla wszystkich moich kodów w celu standaryzacji), jest to prawdopodobnie najłatwiejsze.
Ktoś Specjalny

Jak to jest lepsze niż jakakolwiek z już istniejących odpowiedzi, które dały to samo rozwiązanie?
Dan Dascalescu,

17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

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 przypadku Arrayprzekazuje nieruchomości na nowy {}.


Jak to jest lepsze niż jakakolwiek z już istniejących odpowiedzi, które dały to samo rozwiązanie?
Dan Dascalescu,

Dan Dascalescu w tamtym czasie dodałem odpowiedź, że była tylko powyższa odpowiedź dotycząca, O.assignale brakowało wyjaśnienia. Obecnie {...array}
rozkładanie


11

Pięć lat później jest dobry sposób :)

Object.assign został wprowadzony w ECMAScript 2015.

Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}

10

Za pomocą javascript#forEachjednego można to zrobić

var result = {},
    attributes = ['a', 'b','c'];

attributes.forEach(function(prop,index) {
  result[index] = prop;
});

Z ECMA6:

attributes.forEach((prop,index)=>result[index] = prop);

10

FWIW, jednym z ostatnich ostatnich podejść jest użycie nowego Object.fromEntrieswraz z Object.entriesnastępującymi:

const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));

... co pozwala uniknąć przechowywania rzadkich elementów tablicy jako undefinedlubnull i zachowuje klucze nieindeksowane (np. nie dodatnie liczby całkowite / nienumeryczne).

Można arr.lengthjednak dodać , ponieważ nie jest to uwzględnione:

obj.length = arr.length;


9

Jeśli używasz ES6, możesz użyć Object.assign i operatora rozkładania

{ ...['a', 'b', 'c'] }

Jeśli masz zagnieżdżoną tablicę jak

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))

1
Nie tylko twoje nazwy zmiennych są różne, ale twój przykład nie będzie działał, tworzenie mapy z konstruktora początkowo wymaga tablicy klucz-wartość 2d. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins

5

Szybki i brudny:

var obj = {},
  arr = ['a','b','c'],
  l = arr.length; 

while( l && (obj[--l] = arr.pop() ) ){};

Myślę, że zapomniałeś tego przetestować; produkuje {0:"c", 1:"b", 2:"a"}. Możesz unshiftzamiast tego poplub (lepiej) zacząć od i=arr.length-1i zamiast tego zmniejszyć.
Phrogz,

tak .. właśnie to zmieniłem, ale potem stało się mniej interesujące: /
Mic

Mógłbym nawet zrobić l = arr.length, a potem while (l && (obj[--l] = arr.pop())){}(zdaję sobie sprawę, że to jest stare, ale dlaczego nie uprościć go jeszcze bardziej).
Qix - MONICA ZOSTAŁ SZYBOWIONY

2
@Qix, Fajne skrócenie
Mic

4

Szybki i brudny # 2:

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( a[i] ) { s[i] = a[i++] };

Dlaczego używasz notacji przecinkowych?
Conner Ruhl

3
Osobiste preferencje, aby przecinek prowadził w następnym wierszu. Uważam, że ten zapis jest łatwiejszy do odczytania.
BingeBoy,

1
Pętla zatrzyma się, jeśli tablica zawiera wartość fałszowania. Powinieneś sprawdzić i < a.lengthzamiast a[i].
Oriol


3

Oto funkcja rekurencyjna, którą właśnie napisałem. To proste i działa dobrze.

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

Oto przykład ( jsFiddle ):

var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

Wyniki: Tablica rekurencyjna do obiektu


Działa naprawdę dobrze. Dzięki
Hanmaslah

To powinno być wyżej, jeśli masz ['a' = '1', 'b' = '2', 'c' = '3']i chcesz, żeby {a: 1, b: 2, c: 3}to działało idealnie.
Wanjia

3
.reduce((o,v,i)=>(o[i]=v,o), {})

[dokumenty]

lub bardziej szczegółowe

var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

lub

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

najkrótszy z waniliowym JS

JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

bardziej złożony przykład

[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

jeszcze krótszy (przy użyciu function(e) {console.log(e); return e;}=== (e)=>(console.log(e),e))

 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/ docs]


Z czym miałeś zamiar [/docs]? Przydałoby się uczynienie fragmentów kodu wykonywalnymi.
Dan Dascalescu

3

Zrobiłbym to po prostu Array.of(). Tablica ma możliwość wykorzystania kontekstu jako konstruktora.

UWAGA 2 Funkcja jest celowo ogólną metodą fabryczną; nie wymaga, aby ta wartość była konstruktorem Array. Dlatego może być przenoszony lub dziedziczony przez inne konstruktory, które mogą być wywoływane za pomocą pojedynczego argumentu numerycznego.

Możemy więc powiązać Array.of()się z funkcją i wygenerować obiekt podobny do tablicy.

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

Korzystając z niej Array.of() można nawet dokonać podklasowania tablicy .


3

Jeśli możesz użyć MaplubObject.assign , jest to bardzo łatwe.

Utwórz tablicę:

const languages = ['css', 'javascript', 'php', 'html'];

Poniżej utworzono obiekt z indeksem jako kluczami:

Object.assign({}, languages)

Powtórz to samo co powyżej w Mapach

Konwertuje na obiekt oparty na indeksie {0 : 'css'}itp ...

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

Konwertuj na obiekt oparty na wartości {css : 'css is great'}itp ...

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great

3

Prosta i bezczelna metoda szybkiego konwertowania tablicy przedmiotów na obiekt

function arrayToObject( srcArray ){
    return  JSON.parse( JSON.stringify( srcArray ) );
}

Więc używaj go tak ...

var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`

Wynik:

pork pie

Sprawdzanie typu:

typeof obj
"object"

I rzeczy nie byłyby kompletne, gdyby nie było prototypowej metody

Array.prototype.toObject =function(){
    return  JSON.parse( JSON.stringify( this ) );
}

Za pomocą:

var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`

Wynik:

cheese whizz

* 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.

Array.prototype.toObject = function(keys){
    var obj = {};
    var tmp = this; // we want the original array intact.
    if(keys.length == this.length){
        var c = this.length-1;
        while( c>=0 ){
            obj[ keys[ c ] ] = tmp[c];
            c--;
        }
    }
    return obj;
};

result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);

console.log(">>> :" + result.onion); wyświetli „malować”, funkcja musi mieć tablice o równej długości lub otrzymasz pusty obiekt.

Oto zaktualizowana metoda

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};

To niszczy zarówno zawartość tablicy kluczy, jak i, pomimo wewnętrznego komentarza, także tablicę wartości (jej zawartość). JavaScript działa inaczej niż PHP, a JavaScript działa automatycznie na podstawie właściwości obiektu / tablicy.
Brett Zamir

Nie, nie rutyna wykonuje kopii, oryginał nie jest dotykany.
Mark Giblin

Tak, oryginał jest dotknięty. Zobacz jsfiddle.net/bRTv7 . Długości tablic kończą się na 0.
Brett Zamir

Ok, edytowana wersja, którą właśnie zmieniłem, nie niszczy tablic, dziwne, że powinna była to zrobić.
Mark Giblin

1
Zaktualizowana metoda, która powinna być obsługiwana w starszych przeglądarkach, ponieważ JSON istnieje już dłużej niż ECMA dodała nowe funkcje kodu
Mark Giblin

2

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

Albo użyj

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})


2

ES5 - Rozwiązanie:

Za pomocą prototypowej funkcji Array „push” i „Apply” można wypełnić obiekt elementami tablicy.

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c


Co jeśli chcę przekonwertować na{ name: a, div :b, salary:c}
Prashant Pimpale

2

Więcej obsługiwanych przeglądarek i bardziej elastyczny sposób korzystania z normalnej pętli , na przykład:

const arr = ['a', 'b', 'c'],
obj = {};

for (let i=0; i<arr.length; i++) {
   obj[i] = arr[i];
}

Ale również nowoczesnym sposobem może być użycie operatora rozprzestrzeniania , takiego jak:

{...arr}

Lub Przypisanie obiektu :

Object.assign({}, ['a', 'b', 'c']);

Oba powrócą :

{0: "a", 1: "b", 2: "c"}

1

Możesz użyć takiej funkcji:

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

Ten powinien efektywniej obsługiwać rzadkie tablice.


1

Oto rozwiązanie w coffeescript

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj

7
Co to jest kawa? Mówimy o JS! : D
m93a

2
To mały język, który kompiluje się w JavaScript :)
David

6
Hmph, używa dziwnej notacji. Bardziej lubię zwykły JS.
m93a

2
@David Mógłbyś zrobić całą pętlę for na 1 linii, aby wszystko było tylko 3 liniami. :) Przykład:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.