JavaScript多维数组长度始终返回0,如何解决此问题?
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
答案 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
},
};
旁注:arr
和test
是非常不好的名字。
答案 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,这使您可以根据需要按键查询对象。