在JavaScript关联数组中dynamic创build键

我怎样才能dynamic创buildJavaScript关联数组中的键?

到目前为止,我发现的所有文档都是更新已经创build的密钥:

arr['key'] = val; 

我有这样的string" name = oscar "

我想最终得到这样的东西:

 { name: 'whatever' } 

那就是分割string并得到第一个元素,我想把它放在字典中。

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

使用第一个例子。 如果密钥不存在,它将被添加。

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

会popup一个包含“oscar”的消息框。

尝试:

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

不知何故,所有的例子,虽然工作得很好,但过于复杂:

  • 他们使用new Array() ,这是一个简单的关联数组(AKA字典)矫枉过正(和开销)。
  • 更好的使用new Object() 。 工作正常,但为什么所有这些额外的打字?

这个问题被标记为“初学者”,所以让我们简单。

在JavaScript中使用字典的超级简单的方法或“为什么JavaScript没有特殊的字典对象?”:

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

现在让我们改变值:

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

删除值也很简单:

 // 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 没有关联数组 ,它有对象

下面的代码行完全相同 – 将对象上的“name”字段设置为“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'; 

它看起来像你有一个关联数组,因为一个Array也是一个Object – 但是你实际上并没有在数组中添加东西,你正在设置对象上的字段。

现在已经清理完毕了,下面是您的示例的一个工作解决scheme

 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. 

为了响应MK_Dev,可以迭代,但不能连续。 (对于这显然是一个数组是必要的)

快速谷歌search带来了JavaScript的哈希表

用于循环散列值的示例代码(来自前面提到的链接):

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

原始代码(我添加了行号,所以可以参考他们):

 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. 

差不多了…

  • 第1行:你应该对文字进行trim ,这样就是name = oscar
  • 第3行:没关系,只要你总是有你的平等空间。 可能会更好,不trim第1行,使用=和修剪每个keyValuePair
  • 在3和4之前添加一行:

     key = keyValuePair[0];` 
  • 第4行:现在变成:

     dict[key] = keyValuePair[1]; 
  • 第5行:更改为:

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

我想说的是, dict[keyValuePair[0]]不起作用,你需要设置一个stringkeyValuePair[0]并使用它作为关联的关键。 这是我得到我工作的唯一途径。 设置完成后,您可以使用数字索引或键入引号来引用它。

希望有所帮助。

所有的现代浏览器都支持一个Map ,它是一个键/值数据结构。 使用Map比Object更好的原因有两个:

  • 一个对象有一个原型,所以在地图上有默认的键。
  • 对象的键是string,它们可以是Map的任何值。
  • 您可以轻松获得地图的大小,而您必须跟踪对象的大小。

例:

 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" 

如果你想要从其他对象中没有引用的密钥被垃圾收集,可以考虑使用WeakMap而不是Map。

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

这是好的,但迭代通过数组对象的每个属性。 如果你只想遍历属性myArray.one,myArray.two …你试试这样

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

现在,您可以通过myArray [“one”]访问这两个属性,并仅通过这些属性进行迭代。

我觉得如果你是这样创build的话会更好

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

欲了解更多信息,请看看这个

JavaScript数据结构 – 关联数组

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

}