JavaScript中的多维关联数组

有以下查询结果:(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 ... 

我希望将数据存储在一个网格(也许作为一个数组) 循环所有的logging是这样的:

  apple orange banana melon fred 2 4 7 - mary - 10 - - sarah - - - 5 

在PHP中,使用关联数组非常简单:

 $result['fred']['apple'] = 2; 

但在JavaScript这样的关联数组不起作用。 读了大量的教程后,我所能得到的只是:

 arr=[]; arr[1]['apple'] = 2; 

但是arr['fred']['apple'] = 2; 不起作用。 我尝试过对象的数组,但是对象属性不能是自由文本。 我正在阅读的教程越多,我越困惑…

任何想法是欢迎:)

只要使用一个普通的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 } }; 

如果你正在查看价值观,你可能会看到如下所示:

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

如果它不一定是一个数组,你可以创build一个“多维”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> 

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

因为我需要以一种很好的方式获得所有元素,所以我遇到了这个SO主题。 遍历二维关联数组/对象 – 无论我的名字,因为function计数

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

不要使用数组,请使用对象。

  var foo = new Object(); 

当属性名称为整数时,获取关联数组属性数组的值:

从属性名称为整数的关联数组开始:

 var categories = [ {"1":"Category 1"}, {"2":"Category 2"}, {"3":"Category 3"}, {"4":"Category 4"} ]; 

将项目推送到数组:

 categories.push({"2300": "Category 2300"}); categories.push({"2301": "Category 2301"}); 

循环访问数组,并使用属性值进行操作。

 for (var i = 0; i < categories.length; i++) { for (var categoryid in categories[i]) { var category = categories[i][categoryid]; // log progress to the console console.log(categoryid + " : " + category); // ... do something } } 

控制台输出应该如下所示:

 1 : Category 1 2 : Category 2 3 : Category 3 4 : Category 4 2300 : Category 2300 2301 : Category 2301 

正如你所看到的,你可以绕过关联数组的限制,并有一个属性名称是一个整数。

注意:在我的例子中的关联数组是如果你序列化一个Dictionary []对象,你将有的JSON。

看来对于某些应用程序来说,在javascript中有一种更简单的多维关联数组方法。

1)考虑到所有数组的内部表示实际上都是对象的对象,已经表明数字索引元素的访问时间实际上与关联(文本)索引元素的访问时间相同。

2)一级联想索引元素的访问时间不会随着实际元素数量的增加而增加。

鉴于此,可能有很多情况下使用串联string方法创build多维元素的等价性实际上更好。 例如:

 store['fruit']['apples']['granny']['price] = 10 store['cereal']['natural']['oats']['quack'] = 20 

去:

 store['fruit.apples.granny.price'] = 10 store['cereal.natural.oats.quack'] = 20 

优点包括:

  • 不需要初始化子对象或找出如何最好地组合对象
  • 单级访问时间。 对象内的对象需要N倍的访问时间
  • 可以使用Object.keys()来提取所有的维度信息和..
  • 可以使用函数regex.test(string)和键上的array.map函数来提取出你想要的。
  • 在维度中没有层次结构。
  • “点”是任意的 – 使用下划线实际上使正则expression式更容易
  • 有很多脚本可以将JSON“压扁”进出这种格式
  • 可以在键列表上使用所有其他漂亮的数组处理函数
 <script language="javascript"> // Set values to variable var sectionName = "TestSection"; var fileMap = "fileMapData"; var fileId = "foobar"; var fileValue= "foobar.png"; var fileId2 = "barfoo"; var fileValue2= "barfoo.jpg"; // Create top-level image object var images = {}; // Create second-level object in images object with // the name of sectionName value images[sectionName] = {}; // Create a third level object var fileMapObj = {}; // Add the third level object to the second level object images[sectionName][fileMap] = fileMapObj; // Add forth level associate array key and value data images[sectionName][fileMap][fileId] = fileValue; images[sectionName][fileMap][fileId2] = fileValue2; // All variables alert ("Example 1 Value: " + images[sectionName][fileMap][fileId]); // All keys with dots alert ("Example 2 Value: " + images.TestSection.fileMapData.foobar); // Mixed with a different final key alert ("Example 3 Value: " + images[sectionName]['fileMapData'][fileId2]); // Mixed brackets and dots... alert ("Example 4 Value: " + images[sectionName]['fileMapData'].barfoo); // This will FAIL! variable names must be in brackets! alert ("Example 5 Value: " + images[sectionName]['fileMapData'].fileId2); // Produces: "Example 5 Value: undefined". // This will NOT work either. Values must be quoted in brackets. alert ("Example 6 Value: " + images[sectionName][fileMapData].barfoo); // Throws and exception and stops execution with error: fileMapData is not defined // We never get here because of the uncaught exception above... alert ("The End!"); </script> 

你不需要必须使用对象,你可以使用普通的multidimensional array。

这是我的解决scheme没有对象

 // Javascript const matrix = []; matrix.key1 = [ 'value1', 'value2', ]; matrix.key2 = [ 'value3', ]; 

在PHP中相当于:

 // PHP $matrix = [ "key1" => [ 'value1', 'value2', ], "key2" => [ 'value3', ] ];