在javascript中创建多维数组

时间:2014-03-01 20:01:22

标签: javascript arrays multidimensional-array

我想创建一个像这样的多维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

怎么了?提前谢谢。

1 个答案:

答案 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) );