开发者问题收集

带数组的对象

2020-09-22
84

我对 Javascript 还不熟悉,我正在尝试创建内部带有数组的对象。 在 C 中,我可以使用结构轻松解决此问题,但在 Javascript 中,我有点迷茫。这是我的代码:

function Switch() {
  var title;
  var toggleModeEnable;
};

function Layer () {
  sw = [8];
  for (j = 0; j < 8; j++) {
      sw[j] = new Switch();
  };
};

var lr = [10];
for (i = 0; i < 10; i++) {
    lr[i] = new Layer();
};

显然,这行不通。 我想要实现的是拥有一个包含 10 个元素的数组 (lr)。每个元素都应该是包含 8 个元素 (sw) 的 ayyay,每个元素都有两个属性 (title 和 toggleModeEnable),并使用以下方式访问它们:

lr[1].sw[3].title

但这样的操作会引发错误,例如:

"Uncaught TypeError: Cannot read property '3' of undefined at :1:9"

我在这里遗漏了什么?

3个回答

我相信您正在寻找:

function Switch() {
  this.title = '';
  this.toggleModeEnable = false;
}

function Layer () {
  this.sw = [];
  for (let j = 0; j < 8; j++) {
    this.sw.push(new Switch());
  }
}

const lr = [];
for (let i = 0; i < 10; i++) {
  lr.push(new Layer());
}
2020-09-22

有几件事你应该考虑。

  • 首先 ,变量应该使用 letconst 来定义,而不是 var 。使用 var 定义变量可能会导致 "use strict" 模式下出现问题,如 docs

  • 中所述
  • 其次 ,函数应该返回某些内容。

  • 第三 SwitchLayer 函数均不接受参数,因此它们将返回相同的值。

  • 第四 ,由于它们是函数,因此您不应使用 new ,除非它们已被定义为对象 - 您只需调用该函数即可。

  • 最后 ,因为存储在数组中的对象没有键名称,您只需使用 lr[0][0] 从数组中的第一个对象获取第一个值。

因此,考虑到所有这些,请尝试以下操作:

function Layer (i) {

  function Switch(j) {
    let title = "aaa." + i + "." + j;
    let toggleModeEnable = false;
    return {title, toggleModeEnable};
  };

  let sw = [8];
  for (j = 0; j < 8; j++) {
    sw[j] = Switch(j);
   };
   
   return sw;
};

let lr = [10];
for (i = 0; i < 10; i++) {
    lr[i] = Layer(i);
};

console.log(lr[1][3]);
console.log(lr[1][6]);
ATD
2020-09-22

可以添加参数,让结构更加灵活。

const test = LR(10);
console.log(test);
function LR(length){
    const lr=[];
    for (let i = 0; i < length; i++){
      lr.push(LAYER(8));
      return lr;
   }
}

function SWITCH(title){
  return {
    title:title,
    toggleModeEnable:false
  }
}
function LAYER(size){
  const sw=[];
   for (let j = 0; j < size; j++) {
    sw.push(SWITCH(""));
  }
  return sw;
}
altruios
2020-09-22