Frage

Wie kann ich dynamisch Schlüssel in Javascript assoziative Arrays erstellen?

Die gesamte Dokumentation die ich bisher gefunden habe, ist Schlüssel zu aktualisieren, die bereits erstellt werden:

 arr['key'] = val;

Ich habe eine Zeichenfolge wie diese " name = oscar "

Und ich will mit so etwas Ende:

{ name: 'whatever' }

Das ist ich die Zeichenfolge aufgeteilt und das erste Element bekommen, und ich mag, dass in einem Wörterbuch setzen.

Code

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
War es hilfreich?

Lösung

Mit dem ersten Beispiel. Wenn der Schlüssel nicht existiert, wird es hinzugefügt werden.

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

Wird ein Meldungsfeld enthält 'oscar' Pop-up.

Versuchen:

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

Andere Tipps

Irgendwie alle Beispiele, während sie funktionieren gut, sind zu kompliziert:

  • Sie nutzen new Array(), das ist zuviel des Guten (und ein Overhead) für ein einfaches assoziatives Array (AKA-Wörterbuch).
  • Die besseren verwenden new Object(). Funktioniert gut, aber warum all diese zusätzliche Eingabe?

Diese Frage ist mit „Anfängern“, so läßt es sich einfach machen.

Die uber-einfache Art und Weise ein Wörterbuch in JavaScript zu verwenden, oder „Warum kein JavaScript ein spezielles Wörterbuch bezwecken?“:

// 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];

Nun wollen wir Werte ändern:

// 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]);
  }
}

Werte löschen ist einfach zu:

// 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 ;-)
}

Javascript hat nicht assoziativen Arrays , hat es Objekte .

Die folgenden Codezeilen alle tun genau das Gleiche -. Stellen Sie den ‚name‘ Feld auf ein Objekt ‚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 aus wie Sie ein assoziatives Array, weil ein Array auch ein Object ist -. Aber du bist nicht wirklich Dinge in das Array an all hinzufügen, sind Sie Felder auf der Objekteinstellung

Nun, da das geklärt ist, ist hier eine funktionierende Lösung zu Ihrem 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.

Als Reaktion auf MK_Dev, ist man in der Lage zu durchlaufen, aber nicht nacheinander. (für diese offensichtlich ein Array benötigt wird)

schnelle Google-Suche bringt Hash-Tabellen in Javascript

Beispiel-Code für in einem Hash-Werten über Looping (von oben genannten Verbindung):

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]);
}

Original-Code (Ich habe die Zeilennummern so auf sie 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 da ...

  • Linie. 1: Sie sollten einen trim auf Text tun, damit es name = oscar ist
  • Zeile 3: okay, solange man immer Räume um Ihre gleich.       könnte besser sein, nicht trim in Zeile 1, = verwenden und jede KeyValuePair trimmen
  • eine Zeile nach 3 hinzufügen und vor dem 4:

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

    dict[key] = keyValuePair[1];
    
  • Zeile 5: Änderung:

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

Was ich versuche zu sagen, dass der dict[keyValuePair[0]] nicht funktioniert, müssen Sie eine Zeichenfolge festgelegt, dass als assoziativen Schlüssel keyValuePair[0] und zu verwenden. Das ist der einzige Weg, ich habe mich zu arbeiten. Nachdem Sie es eingerichtet haben, können Sie entweder mit numerischen Index oder Schlüssel in Anführungszeichen verweisen.

Ich hoffe, das hilft.

Alle modernen Browser unterstützen eine Karte , die ein Schlüssel / Wert-Daten Striktur. Es gibt ein paar Gründe, die eine Karte besser als Objekt machen mit:

  
      
  • Ein Objekt hat einen Prototyp, so gibt es Standardschlüssel in der Karte an.
  •   
  • Die Schlüssel eines Objekts sind Strings, wo sie jeder Wert für eine Karte sein kann.
  •   
  • Sie können die Größe einer Karte leicht erhalten, während Sie für ein Objekt verfolgen Größe zu halten haben.
  •   

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, die Schlüssel von anderen Objekten referenziert werden, nicht Müll gesammelt werden, sollten Sie mit einem WeakMap statt einer Karte.

Ich denke, es ist besser, wenn man einfach so erstellt

var arr = [];

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

für weitere Informationen, werfen Sie einen Blick auf diese

JavaScript Datenstrukturen - assoziatives Array

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]);
}

Das ist in Ordnung, aber durchläuft jede Eigenschaft des Array-Objekts. wenn Sie möchten, die Eigenschaften durchlaufen myArray.one, myArray.two ... Sie versuchen, wie diese

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 beide Zugriff von myArray [ „one“] und iterieren nur durch diese Eigenschaften.

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]);
                }

            }
        };

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top