【问题标题】:How to achieve this multidimensional array in the most efficient way?如何以最有效的方式实现这个多维数组?
【发布时间】:2012-08-31 15:11:44
【问题描述】:

我想用 JavaScript 创建这个数组:

    -----------------------------------------------
    |                     |         male          |
    |                     |-----------------------|
    |   rafael            |         single        |
    |                     |-----------------------|
    |                     |          22           | 
    |---------------------|-----------------------|
    |                     |         male          |
    |   jack              |-----------------------|
    |                     |         married       |      
    |                     |-----------------------|
    |                     |         34            |
    -----------------------------------------------

经过深思熟虑如何制作它,我只是使用了这个:

var arr = [];
for(i = 0 ; i < 2 ; i++){
    arr[i] = [2]
    for (j = 0; j < 3 ; j++){
        arr[i][1] = [3];
        arr[i][1][j] = "this is row :" + i + ", column : 1, row : " + j ;
        console.log(arr[i][1][j]);
    }
}

还有其他方法,使用对象构造函数或对象字面量来实现吗? 因为我想这样访问它

obj["first row"]["third row in second column"]

我希望用户在每个单元格中输入任何值,并像这样调用它:

obj["rafael"]["age"];

注意,我不知道会有多少行,我只是在其中放置任意值以及任意单元格名称。

【问题讨论】:

  • 因为我希望每行有两列。
  • 每个大行是否保证包含 3 个小行?
  • 是的,每行中的每个第二个单元格都有 3 个小行。
  • 三个小行代表什么?
  • 好的,我将编辑问题,并提供有关内容的更多详细信息。

标签: javascript object multidimensional-array constructor object-literal


【解决方案1】:

我不会让它成为一个数组,而是一个对象......因为无论如何你都像使用对象一样使用它。 (如果您不使用整数索引和长度属性,则无论如何您都可以像使用基本对象一样使用数组。所有数组都是对象,并非所有对象都是数组。)

当然,将null 替换为您将使用的值。或者您可以将它们保留为占位符。

var a = {
  "first row": {
    "first row in second column": null,
    "second row in second column": null,
    "third row in second column": null
  },
  "second row": {
    "first row in second column": null,
    "second row in second column": null,
    "third row in second column": null
  }
}

啊,如果它是动态的,那么我会做这样的事情:

var folk = {};  // Our basic place holder.
var person = {};  // The 'inner information' to populate.
person.married = true;
person.age = 41;
person.address = "777 Heaven's Gate";
folk["Jeremy J Starcher"] = person;

// Next person
person = {};
person.gender = 'male';
person.insurance = true;
folk["John Doe"] = person;

window.alert(folk["John Doe"]["gender"]);
window.alert(folk["John Doe"].gender);

【讨论】:

  • 但我希望它是动态的,我不知道用户想要多少行,或者每个键的名称。这两行只是一个例子。
【解决方案2】:

这会给你一个具有动态属性的对象:

var arr = new Object();
for(i = 0 ; i < 2 ; i++){
    var rowName = "row"+i;
    arr[rowName] = new Object();
    for (j = 0; j < 3 ; j++){
        var colName = "col"+j;
        arr[rowName][colName] = "this is row " + i + ", column " + j;
    }
}
console.log(arr);

【讨论】:

    【解决方案3】:

    我会将您的数据映射到以下单元格:

        -----------------------------------------------
        | arr[0].left         | arr[0].right[0]       |
        |                     |-----------------------|
        |                     | arr[0].right[1]       |
        |                     |-----------------------|
        |                     | arr[0].right[2]       | 
        -----------------------------------------------
        | arr[1].left         | arr[1].right[0]       |
        |                     |-----------------------|
        |                     | arr[1].right[1]       |
        |                     |-----------------------|
        |                     | arr[1].right[2]       | 
        -----------------------------------------------
    

    你可以这样做:

    var arr = []
    
    for(var i = 0; i < rows; i++) {
        arr[i] = {
            left: "someText",
            right: [
                "some",
                "more",
                "text"
            ]
        };
    }
    

    【讨论】:

      【解决方案4】:

      看到你的编辑,你要么想要:

      var data = {
          rafael: {
              gender: "male",
              status: "single",
              age: "22"
          },
          jack: {
              gender: "male",
              status: "married",
              age: "34"
          }
      };
      

      var data = [{
          name: "rafael",
          gender: "male",
          status: "single",
          age: "22"
      }, {
          name: "jack",
          gender: "male",
          status: "married",
          age: "34"
      }];
      

      【讨论】:

      • 在您的第一个示例中,我可以制作最外部的对象,即 data 动态的吗?我的意思是用户可以向其中输入新数据,例如mark
      【解决方案5】:

      如果您想通过字符串名称访问元素,则需要使用对象。数组只支持数字索引。

      var data = {
          'first row': {
              'first column': 'foo',
              'second column': 'bar',
              'third column': 'baz'
          },
          'second row': {
              'first column': 'foo',
              'second column': 'bar',
              'third column': 'baz'
          }
      };
      
      data['first row']['first column']; // gives you 'foo' 
      

      请注意,只有当键名具有无效的标识符字符(在本例中为空格)时,您才需要引用键名

      【讨论】:

      • 但我希望它是动态的,我不知道用户想要多少行,或者每个键的名称。这两行只是一个例子。
      猜你喜欢
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多