2016-06-03 3 views
0

Ich frage mich, ob es eine einfache Möglichkeit gibt, eine Karte aus einem Array von Schlüsseln und einem Array von Werten zu erstellen. für exemple, wenn ich 2 ArraysErstellen einer Karte aus 2 Arrays von Werten und Schlüsseln in Javascript

var keys = [0, 4, 2, 3, 1]; 
var values = ["first", "second", "third", "fourth", "fifth"]; 

und ich beabsichtige, diese Karte zu erhalten:

{ 
    0 => 'first', 
    4 => 'second', 
    2 => 'third', 
    3 => 'fourth', 
    1 => 'fifth' } 

natürlich etwas schneller Ich suche als:

var myMap = new Map(); 
for (var i = 0 ; i < keys.length; i++) 
myMap.set(keys[i], values[i]); 

, weil es O (n) und ich suche etwas O (1)

+1

Ich denke nicht, dass dies in O (1) getan werden kann, aber ich könnte falsch liegen. – marcusshep

+0

Wenn es keine Hashwert-Kollisionen gibt und Sie sich nicht um die Reihenfolge kümmern müssen, können Sie FastMap verwenden: http://www.collectionsjs.com/fast-map –

+1

Sie haben 'n' Werte, die Sie hinzufügen möchten Karte. Egal, was Sie tun, eine Karte kann nicht gleichzeitig 'n'-Werte setzen. –

Antwort

0

Sie suchen nach Object.assign (funktioniert nicht bei jedem Benutzer-Agent).

Die Object.assign() Methode wird verwendet, um die Werte aller enumerable eigenen Eigenschaften von einem oder mehreren Quellobjekte zu einem Zielobjekt zu kopieren. Es wird das Zielobjekt zurückgeben.

var sum = ["first", "second", "third", "fourth", "fifth"], 
 
    obj = Object.assign({}, sum); 
 

 
console.log(obj);

+0

oh, wie schön, ein DV, bitte fügen Sie Ihre Motivation, wenn Sie möchten. –

+1

Wie lautet Ihre Antwort auf die Frage, wie Sie "eine Map aus einem Array von Schlüsseln und einem Array von Werten" erstellen? Außerdem kopiert Object.assign alle Eigenschaften mithilfe von Getter und Setter, sodass es nicht besser als O (n) sein kann. –

+1

* "Ich suche etwas schneller als [...] weil es O (n) ist und ich suche etwas O (1)" *. es ist eine Frage mit zwei Teilen. Meine Antwort behandelt den ersten Teil. Die zweite ist ziemlich unklar, weil sie auf der Implementierung beruht. –

-1

Nun können Sie immer Dinge tun, wie dies in O (1); in dem Sie die Eigenschaften nicht nacheinander kopieren und ein Objekt erhalten.

var values = ["first", "second", "third", "fourth", "fifth"], 
 
     obj = Object.create(values); 
 
console.log(typeof(obj)); 
 
console.log(Array.isArray(obj)); 
 
console.log(obj[2]);

+0

Es scheint, dass viele Leute hier die Anzahl der High-Level-Funktionsaufrufe mit der Anzahl der Anweisungen verwechseln, die die Laufzeitkomplexität bestimmen. –

+0

@le_m Es scheint, dass Sie sehr kenntnisreich sind. Könntest du mir bitte die Komplexität erklären, ein leeres Objekt zu erstellen und ein Array seinem Prototyp zuzuweisen ..? Für mich ist diese Antwort völlig legitim und sehr schnell O (1). Angesichts der OP-Bedingungen (Indizes als Eigenschaften) ist es auch perfekt für eine Karte geeignet. – Redu

+1

Sie haben Recht, nach http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html auf V8, die Object.create() Implementierung ist in der Tat in O (1) - mein Kommentar sollte auf die OP-Frage gehen, nicht Ihre Antwort (Entschuldigung dafür)! Doch wie geht Ihre Antwort auf das Problem von OP ein, gegebene Schlüssel bestimmten Werten zuzuordnen? –

0

Javascript ES6, gibt es keine Möglichkeit, ein Map aus einer Vielzahl von Schlüsseln und Werten mit besserer Laufzeitkomplexität als O (n) aufzubauen.

Wenn Sie einen kombinierten Schlüssel-Wert hatte, konnte man es als ersten Parameter an die Map() Konstruktor übergeben:

var map = new Map([[1, 'first'], [2, 'second'], …]); 

Mit zwei separate Arrays für Schlüssel und Werte, aber sie eine Zugabe - by-one pro for-loop ist immer noch die schnellste Option.

Verwandte Themen