it-swarm.com.de

Dynamisches Erstellen von Schlüsseln in einem assoziativen JavaScript-Array

Wie kann ich dynamisch Schlüssel in assoziativen JavaScript-Arrays erstellen?

Die gesamte Dokumentation, die ich bisher gefunden habe, dient zum Aktualisieren von Schlüsseln, die bereits erstellt wurden:

 arr['key'] = val;

Ich habe eine Zeichenfolge wie diese " name = oscar "

Und ich möchte mit so etwas enden:

{ name: 'whatever' }

Das heißt, ich teile den String auf und erhalte das erste Element, das ich in ein Wörterbuch schreiben möchte.

Code

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
196
OscarRyz

Verwenden Sie das erste Beispiel. Wenn der Schlüssel nicht existiert, wird er hinzugefügt.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

Öffnet ein Meldungsfenster mit dem Inhalt "oscar".

Versuchen:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
141
tvanfosson

Irgendwie sind alle Beispiele, obwohl sie gut funktionieren, zu kompliziert:

  • Sie verwenden new Array(), einen Overkill (und einen Overhead) für ein einfaches assoziatives Array (AKA Dictionary).
  • Die besseren benutzen new Object(). Funktioniert gut, aber warum all das zusätzliche Tippen?

Diese Frage ist mit "Anfänger" markiert. Machen wir es uns einfach.

Die einfachste Möglichkeit, ein Wörterbuch in JavaScript zu verwenden, oder "Warum hat JavaScript kein spezielles Wörterbuchobjekt?":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

Jetzt ändern wir die Werte:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

Das Löschen von Werten ist ebenfalls einfach:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}
484
Eugene Lazutkin

Javascript hat keine assoziativen Arrays, es hat Objekte.

Die folgenden Codezeilen tun genau dasselbe: Setzen Sie das Feld 'name' eines Objekts auf 'orion'.

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

Es sieht so aus, als hätten Sie ein assoziatives Array, da ein Array auch ein Object ist. Sie fügen dem Array jedoch überhaupt keine Elemente hinzu, sondern legen Felder für das Objekt fest.

Nachdem dies geklärt ist, finden Sie hier eine funktionierende Lösung für Ihr Beispiel

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.
29
Orion Edwards

Als Antwort auf MK_Dev kann man iterieren, aber nicht nacheinander. (Dazu wird offensichtlich ein Array benötigt)

Schnelle Google-Suche bringt Hash-Tabellen in Javascript

Beispielcode zum Durchlaufen von Werten in einem Hash (von oben genanntem Link):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}
9
Danny

Originalcode (ich habe die Zeilennummern hinzugefügt, damit sie sich darauf beziehen können):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

Fast dort...

  • zeile 1: Sie sollten trim für Text eingeben, damit dieser name = oscar lautet.
  • zeile 3: Okay, solange du IMMER ein Leerzeichen um dein gleiches hast. Vielleicht ist es besser, in Zeile 1 nicht trim zu setzen, = zu verwenden und jedes keyValuePair zu kürzen
  • füge eine Zeile nach 3 und vor 4 hinzu:

    key = keyValuePair[0];`
    
  • zeile 4: Jetzt wird:

    dict[key] = keyValuePair[1];
    
  • zeile 5: Wechseln zu:

    alert( dict['name'] );  // it will print out 'oscar'
    

Ich versuche zu sagen, dass dict[keyValuePair[0]] Nicht funktioniert. Sie müssen einen String auf keyValuePair[0] Setzen und diesen als assoziativen Schlüssel verwenden. Nur so konnte ich mich an die Arbeit machen. Nachdem Sie es eingerichtet haben, können Sie entweder mit einem numerischen Index darauf verweisen oder Anführungszeichen eingeben.

Ich hoffe, das hilft.

4
Andrea

Alle modernen Browser unterstützen ein Map , das eine Schlüssel/Wert-Daten-Einschränkung darstellt. Es gibt mehrere Gründe, die die Verwendung einer Karte besser machen als die Verwendung eines Objekts:

  • Ein Objekt verfügt über einen Prototyp, sodass die Karte Standardschlüssel enthält.
  • Die Schlüssel eines Objekts sind Strings, bei denen es sich um einen beliebigen Wert für eine Map handeln kann.
  • Sie können die Größe einer Karte leicht ermitteln, während Sie die Größe eines Objekts verfolgen müssen.

Beispiel:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

Wenn Sie möchten, dass Schlüssel, auf die nicht von anderen Objekten verwiesen wird, überflüssig gesammelt werden, sollten Sie ein WeakMap anstelle einer Map verwenden.

3

Ich denke, es ist besser, wenn du so schaffst

var arr = [];

arr = {
   key1: 'value1',
   key2:'value2'
};

weitere Informationen finden Sie hier

JavaScript-Datenstrukturen - Assoziatives Array

3
Karim Samir
var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

}

1
user2266928
var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

dies ist in Ordnung, durchläuft jedoch alle Eigenschaften des Array-Objekts. Wenn Sie nur die Eigenschaften myArray.one, myArray.two durchlaufen möchten, versuchen Sie dies

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.Push("one");
myArray.Push("two");
myArray.Push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

jetzt können Sie sowohl mit myArray ["one"] zugreifen als auch nur über diese Eigenschaften iterieren.

1
Sasinda Rukshan