JavaScript多维数组长度问题

时间:2019-03-24 11:58:30

标签: javascript

JavaScript多维数组长度始终返回0,如何解决此问题?

enter image description here

class test {

  static init() {
    test.arr = [];
  }

  static add() {
    let user_id = Math.floor(Math.random() * 10000);
    if (test.arr["u_" + user_id] === undefined) {
      test.arr["u_" + user_id] = [];
    }
    test.arr["u_" + user_id].push({
      "somedata": "here"
    });
  }

  static length() {
    return test.arr.length;
  }

}
test.init();
test.add();
test.add();
console.log(test.arr.length); //Always returning 0

3 个答案:

答案 0 :(得分:1)

一个数组是一组数字键值对的集合。 "_u" + user_id不是数字,而是一个字符串,因此它作为常规属性存储在数组中(其行为类似于对象),而不是数组本身的一部分。如果要使用具有一定长度的键值存储,请使用Map

 const test = { // no need for a class if you dont have instances
   arr: new Map(), // no need for that unneccessary init
   add() {
    let user_id = Math.floor(Math.random() * 10000);
    if(!this.arr.has("u_" + user_id)) { // I prefer "this" over "test", both work however
      this.arr.set("u_" + user_id, []);
    }
    this.arr.get("u_" + user_id).push({"somedata": "here"});
   },

   length() {
    return this.arr.size; //Note: it is "size" not "length" on a Map
   },
};

旁注:arrtest是非常不好的名字。

答案 1 :(得分:1)

只能将数组索引定义为数字。如果要获取数组的长度,有两种方法可以实现。

  • 您需要将索引定义为数字而不是字符串。
  • 制作一个单独的对象,将对象({"somedata": "here"})添加到该对象中,然后将其推入数组。检查下面的代码。

    let test=[]
    let obj = {}
    let user_id = Math.floor(Math.random() * 10000);
    
    if(obj["u_" + user_id] === undefined) {
      obj["u_" + user_id] = [];
    }
    
    obj["u_" + user_id] = {"somedata": "here"};
    test.push(obj)
    

希望这会有所帮助。

答案 2 :(得分:0)

查看以下我为您提供的jsbin。 https://jsbin.com/xeqacuf/edit?console

    constructor()
    {
        console.log("new object created");
        this.test = { arr : {} };
    }

这与您要尝试执行的操作很接近... 让我知道您是否需要解释或更多帮助。 我愿意竭尽所能。 注意,我将数据类型从collection更改为objectKeyValue,这使您可以根据需要按键查询对象。