Omi*_*iod 73 javascript associative-array multidimensional-array
有以下查询结果:(key1和key2可以是任何文本)
id key1 key2 value
1 fred apple 2
2 mary orange 10
3 fred banana 7
4 fred orange 4
5 sarah melon 5
...
Run Code Online (Sandbox Code Playgroud)
我希望将数据存储在网格中(可能作为一个数组)循环所有记录,如下所示:
apple orange banana melon
fred 2 4 7 -
mary - 10 - -
sarah - - - 5
Run Code Online (Sandbox Code Playgroud)
在PHP中,使用关联数组非常简单:
$result['fred']['apple'] = 2;
Run Code Online (Sandbox Code Playgroud)
但在像这样的JavaScript关联数组中不起作用.阅读了大量的教程后,我能得到的就是:
arr=[];
arr[1]['apple'] = 2;
Run Code Online (Sandbox Code Playgroud)
但arr['fred']['apple'] = 2;
不起作用.我尝试过对象数组,但对象属性不能是自由文本.我阅读教程越多,我就越困惑......
欢迎任何想法:)
Mat*_*att 143
只需使用常规JavaScript对象,它将以与关联数组相同的方式"读取".你必须记住首先初始化它们.
var obj = {};
obj['fred'] = {};
if('fred' in obj ){ } // can check for the presence of 'fred'
if(obj.fred) { } // also checks for presence of 'fred'
if(obj['fred']) { } // also checks for presence of 'fred'
// The following statements would all work
obj['fred']['apples'] = 1;
obj.fred.apples = 1;
obj['fred'].apples = 1;
// or build or initialize the structure outright
var obj = { fred: { apples: 1, oranges: 2 }, alice: { lemons: 1 } };
Run Code Online (Sandbox Code Playgroud)
如果您正在查看值,您可能会看到如下内容:
var people = ['fred', 'alice'];
var fruit = ['apples', 'lemons'];
var grid = {};
for(var i = 0; i < people.length; i++){
var name = people[i];
if(name in grid == false){
grid[name] = {}; // must initialize the sub-object, otherwise will get 'undefined' errors
}
for(var j = 0; j < fruit.length; j++){
var fruitName = fruit[j];
grid[name][fruitName] = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
cha*_*fer 21
如果它不具有为一个数组,你可以创建一个"多维" JS对象...
<script type="text/javascript">
var myObj = {
fred: { apples: 2, oranges: 4, bananas: 7, melons: 0 },
mary: { apples: 0, oranges: 10, bananas: 0, melons: 0 },
sarah: { apples: 0, oranges: 0, bananas: 0, melons: 5 }
}
document.write( myObject[ 'fred' ][ 'apples' ] );
</script>
Run Code Online (Sandbox Code Playgroud)
cam*_*aca 10
Javascript很灵活:
var arr = {
"fred": {"apple": 2, "orange": 4},
"mary": {}
//etc, etc
};
alert(arr.fred.orange);
alert(arr["fred"]["orange"]);
for (key in arr.fred)
alert(key + ": " + arr.fred[key]);
Run Code Online (Sandbox Code Playgroud)
因为我需要以一种很好的方式获得所有元素,所以我遇到了这个SO主题"遍历2维关联数组/对象" - 无论我的名字是什么,因为功能很重要.
var imgs_pl = {
'offer': { 'img': 'wer-handwritter_03.png', 'left': 1, 'top': 2 },
'portfolio': { 'img': 'wer-handwritter_10.png', 'left': 1, 'top': 2 },
'special': { 'img': 'wer-handwritter_15.png', 'left': 1, 'top': 2 }
};
for (key in imgs_pl) {
console.log(key);
for (subkey in imgs_pl[key]) {
console.log(imgs_pl[key][subkey]);
}
}
Run Code Online (Sandbox Code Playgroud)
对于某些应用程序,javascript 中的多维关联数组似乎有一种更简单的方法。
鉴于所有数组的内部表示实际上都是对象的对象,已经表明数字索引元素的访问时间实际上与关联(文本)索引元素的访问时间相同。
一级关联索引元素的访问时间不会随着实际元素数量的增加而增加。
鉴于此,可能在很多情况下,使用串联字符串方法来创建多维元素的等价性实际上更好。例如:
store['fruit']['apples']['granny']['price] = 10
store['cereal']['natural']['oats']['quack'] = 20
Run Code Online (Sandbox Code Playgroud)
去:
store['fruit.apples.granny.price'] = 10
store['cereal.natural.oats.quack'] = 20
Run Code Online (Sandbox Code Playgroud)
优点包括: