JavaScript 中的多维关联数组

IT技术 javascript multidimensional-array associative-array
2021-02-03 21:20:50

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

我希望将数据存储在一个网格中(可能是一个数组),像这样循环所有记录:

         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;不起作用。我尝试了对象数组,但对象属性不能是自由文本。我看教程越多,我就越困惑......

欢迎任何想法:)

6个回答

只需使用常规 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;
    }
}
设法在生产代码(Chrome 扩展程序)上使用该示例,并且工作正常。谢谢。终于我学会了如何在 JS 中处理对象!
2021-03-17 21:20:50
我可以通过数字索引访问 obj (fred) 中的第一项吗?像 obj[0] 导致 apples:1, oranges:2 。我可以访问最后一个项目(它是 alice,结果是柠檬:1)吗?`
2021-03-19 21:20:50
不能给这个答案点赞!导致我的对象不断返回 undefined 的部分是我没有初始化子对象。 所以一定要这样做! 例子: grid[name] = {};
2021-03-26 21:20:50
@Matt 有没有办法只使用一组 [] 来获取 obj.fred.apples?我假设不是。obj["fred.apples"]例如
2021-03-28 21:20:50
如果我们不知道数组的数量怎么办,例如你的代码 [javasript] var people = ['fred', 'alice']; var Fruit = ['苹果','柠檬']; var color = ['red', 'blue'] var..... --> 数组个数未知[/javascript]
2021-04-09 21:20:50

如果它不具有为一个数组,你可以创建一个“多维” 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(myObj['fred']['apples']);
</script>
谢谢,马特。更新了帖子。
2021-03-25 21:20:50
@charliegriefer,document.write 行不应该是:“document.write(myObj ......”
2021-03-25 21:20:50
JSON 实际上是 JavaScript 对象的“字符串化”格式。您拥有的不是 JSON,而是一个 JavaScript 对象。
2021-04-08 21:20:50

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]);
我会说变量名 'arr' 在这里用词不当,因为它实际上不是一个数组,而是一个对象。
2021-03-28 21:20:50
我是一只懒狗,因此无法使用您的解决方案。如果我一直渴望,我会用你的子数组示例找到我的方法;) 不管怎样,谢谢你的努力。
2021-04-11 21:20:50

因为我需要以一种很好的方式获取所有元素,所以我遇到了这个 SO 主题“遍历二维关联数组/对象”——不管我的名字是什么,因为功能很重要。

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]);
    }
}
应该接受答案,因为循环通常是要走的路。
2021-04-09 21:20:50

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

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

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

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

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 函数来准确地拉出你想要的东西。
  • 维度中没有层次结构。
  • “点”是任意的 - 使用下划线实际上使正则表达式更容易
  • 也有很多脚本可以将 JSON“扁平化”到这种格式中,或者从这种格式中取出
  • 可以在 keylist 上使用所有其他不错的数组处理函数