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