向javascript数组添加字符串
我有以下代码向javascript数组添加字符串,javascript,Javascript,我有以下代码 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 = arr
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”)
和doingconsole.log(array)
之后,数组日志为空,我不明白为什么。。。有人能帮我吗?Tyvm
编辑
等等,伙计们,毕竟我的数组={}是正确的。错误仍然存在:'x
第三章:迷雾加深
伙计们,使用上面的代码,只有当数组以前不是空的时候,我才让它工作,所以如果数组是
{some_key:array[1]}
,它实际上工作。你知道为什么吗?xD'GROUP'与'some_key'不同,因此该组是“新的”数组是数字索引的,不能这样访问
var array = [];
array[0] = 'something';
在您的情况下,您需要一个对象
var obj = {};
obj['name'] = 'dave';
但是请注意,您的代码现在将为length指定NaN,因为对象没有length属性(因此array.length不起作用,当您尝试递增/递减它时,将为您指定NaN)
您需要执行Object.keys(obj.length)
以获取长度
i、 e
Object.keys({name:'bob'}).length
的长度为1您是想写这样的东西吗?它创建一个对象。如果键不存在,则会添加一个数组作为值。然后将第二个参数添加到数组中
var obj = {};
function add(group, to_add) {
if (!obj[group]) obj[group] = [];
obj[group].push(to_add);
}
add("some_group","something");
基于@Andy的答案,可以进一步归结为:
var data = {};
function add(group, value) {
data[group] = data[group] || [];
data[group].push(value);
}
为什么你的代码会失败
实际上,这一行给您带来了问题:
if(index != 0)
index = array.length--;
在数组.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;
}
};
看起来您需要重新了解数组和对象之间的区别。使用数组作为关联是不可能的,请尝试使用JSON对象{}。@AndreCalenta您能否提供一个示例,说明当您使用控制台时,数组
会是什么样子。log
它?很清楚,{}
不是一个“JSON对象”.索引
意味着要做什么?哈哈,这太糟糕了,我被语言搞混了。谢谢大家(我现在不能接受你的答案,我以后再做)别担心,如果我们经常切换语言,这会发生在我们所有人身上。在我在声明中完全正确之后,请看编辑:X这不是OP想要做的。他们希望在这个结构中有一个对象:{“group_name”:[“a”,“b”]}
@atmd请看问题,确实如此,但如果由于以下代码可能会更改对象的相同键属性,那么它不能是短的。我的代码到底出了什么问题?@AndreCalenta,除了我的回答之外,我恐怕不知道你的代码是用来做什么的,或者当前的问题是什么。抱歉。我很难弄清楚索引在OP的代码中到底在做什么。@GregBurghardt看不到问题please@AndreCalenta:代码不起作用的原因是您正在递减数组.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;