我想创建一个像这样的多维javascript数组:
array('cats' => array(
'cat_1' => array(1, 2, 3 ...)
), array(
'cat_2' => array(....
我想根据我的变量添加/删除“cat_id”和“tag_id”......
var filter = {cats : [[]]};
function generateArray(cat_id, tag_id, add = true){
if(add == true)
filter.cats = [cat_id];
filter.cats[cat_id].push(tag_id);
} else {
//How to delete record the tag_id ?
//filter[cats][cat_id].(tag_id);
}
return filter;
}
generateArray(1, 1, true);
generateArray(2, 2, true);
generateArray(2, 3, true); etc...
我有以下错误消息:
undefined不是对象(评估filter.cats [cat_id] .push
怎么了?提前谢谢。
答案 0 :(得分:1)
此代码中的问题:
filter.cats = [cat_id];
filter.cats[cat_id].push(tag_id);
是在第一行中将filter.cats
设置为具有一个元素cat_id
的数组(在索引0上)。然后在第二行中,您尝试访问该数组中的元素,其中索引cat_id
(不是值cat_id)不存在,或者当cat_id为零时是一个数字。一旦你尝试将元素用作对象(通过调用push),就会出现这个错误。
而不是那两行你可以写
if (typeof filter.cats[cat_id] == 'undefined')
filter.cats[cat_id] = [tag_id]; // initialize element as an array object
else
filter.cats[cat_id].push(tag_id); // already initialized, so push
以下是一些代码,为您提供了如何实现目标的示例:
function addCatTag(cats, cat_id, tag_id) {
var cat = cats[cat_id];
if (typeof cat == 'undefined') {
cats[cat_id] = [tag_id];
} else {
cat.push( tag_id );
}
}
function removeCatTag(cats, cat_id, tag_id) {
var cat = cats[cat_id];
if (typeof cat != 'object')
return;
var tag_idx = cat.indexOf(tag_id);
if (tag_idx >= 0) {
cat.splice(tag_idx, 1);
}
}
var cats = {};
addCatTag(cats, 'felix', 1);
addCatTag(cats, 'felix', 2);
addCatTag(cats, 'fluffy', 1);
removeCatTag(cats, 'felix', 2);
alert( JSON.stringify(cats) );