我有以下代码
array = {};
function add(group,to_add){
var index,to_append = "";
if(array[group] === null || array[group] === undefined){
array[group] = [to_add];
index = array.length;
if(index != 0)
index = array.length--;
}else{
array[group].push(to_add);
index = array.indexOf(group)--;
}
}
在add("some_group","something")
之后执行console.log(array)
数组日志为空,我无法理解为什么......有人可以帮我解决这个问题吗? Tyvm
等待所有我有array = {}之后的等待。错误仍然存在:' x
伙计们,通过上面的代码,我只有在数组之前没有空的情况下才能使用,所以如果数组是{ some_key: Array[1] }
,它实际上是有效的。有什么想法吗? xD ' GROUP'与' some_key'不同,因此该群组是"新"
答案 0 :(得分:3)
数组已编号,无法像
那样进行访问var array = [];
array[0] = 'something';
在您的情况下,您需要一个对象
var obj = {};
obj['name'] = 'dave';
请注意,虽然你的代码现在会给NaN一个长度,因为对象没有长度属性(所以array.length不会工作,当你尝试增加/减少它时给你NaN)
您需要Object.keys(obj).length
来获取长度
即Object.keys({name:'bob'}).length
的长度为1
答案 1 :(得分:2)
在@ Andy的答案的基础上,它可以进一步深化:
var data = {};
function add(group, value) {
data[group] = data[group] || [];
data[group].push(value);
}
真的,这一行给你带来了问题:
if(index != 0)
index = array.length--;
在array.length
上使用递减运算符会导致数组删除刚刚推送的最后一个值。这也是为什么你的代码只在数组为空时失败的原因,因为如果数组已经存在,你不会减少array.index
。
为什么不把它变成一个单独的对象,或者更好的是一个类?
function DataStore(data) {
this.data = data || {};
}
DataStore.prototype = {
constructor: DataStore,
add: function(group, value) {
this.data[group] = this.data[group] || [];
return this.data[group].push(value) - 1;
},
contains: function(group, value) {
if (!this.containsGroup(group)) {
return false;
}
return this.data[group].indexOf(value) > -1;
},
containsGroup: function(group) {
return this.data.hasOwnProperty(group);
},
forEach: function(callback, context) {
context = context || this;
var key, index, value, length;
for (key in this.data) {
if (this.data.hasOwnProperty(key)) {
for (index = 0, length = this.data[key].length; i < length; i++) {
value = this.data[key][index];
if (callback.call(context, value, index, key) === false) {
return;
}
}
}
}
},
get: function(group, index) {
if (!this.containsGroup(group)) {
return null;
}
else if (index == null) {
return this.data[group];
}
else if (index >= 0 && index < this.data[group].length) {
return this.data[group][index];
}
else {
return null;
}
},
remove: function(group, value) {
if (!this.containsGroup(group)) {
return -1;
}
var index = this.data[group].indexOf(value);
this.data[group].splice(index, 1);
return index;
}
};
然后使用它:
// An empty DataStore:
var data = new DataStore();
data.add("group", "value");
data.containsGroup("group"); // returns true
data.contains("group", "value"); // returns true;
data.forEach(function(value, index, group) {
console.log(group + "[" + index + "] = " + value);
});
// Seed the data store with values:
var data2 = new DataStore({
foo: ["bar", "baz"]
});
data2.contains("foo", "baz"); // returns true;
答案 2 :(得分:1)
你的意思是写这样的东西吗?它创建了一个对象。如果密钥不存在,则添加一个数组作为值。然后将第二个参数添加到数组中。
var obj = {};
function add(group, to_add) {
if (!obj[group]) obj[group] = [];
obj[group].push(to_add);
}
add("some_group","something");