构建自定义对象调用

时间:2016-03-23 10:28:23

标签: javascript

我有一个看起来像这样的对象(它可以是无限的):

list: [
 {
   list: [
     {
       list: [
         {...}
       ]
     }
   ]
 },
 {
   list: [
     {...}
   ]
 },
 {
   list: [
     {...}
   ]
 }
];

一个数组,指示我应该在这个对象中击中的位置;例如,如果我想进入第三个列表的第二个列表,如果有这个:

target = [3, 2];

我可以创建一个自定义调用,使用我的'target'数组在'list'中获取正确的对象。

感谢您的帮助!

编辑:

我刚刚做了:

var array = list;

for (var i = 0; i < target.length; i++) {
  array = array[target[i]].list;
}

它有效。

由于

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找类似的东西:

var obj = {
  list:[
    {
    list: [
        {
        list: []
        }
    ]
  },
  {
    list: [
        {
        list: []
        }
    ]
  },
  {
    list: [
        {
        list: []
        },
      {
        list: []
        },
      {
        list: []
        },
      {
        list: [
            {
            list: [],
            a: 5
          }
        ]
        }
    ]
  }
  ]
};


function getListObject(theList, indexes) {
  var i;
  for(i = 0; i < indexes.length; i++) {
    theList = (theList && theList.list) ? theList.list[indexes[i]] : null;
  }
  return theList;
}

alert(getListObject(obj, [2, 3, 0]).a);

如果你愿意,你可以使用reduce来实现,但我会通过for循环保持简单。

请注意,我传递了一个带有list属性的OBJECT,并且我正在获取一个带有list属性的对象。 构建一个获取数组并返回一个对象的函数是一个简单的编辑,但我觉得它不符合意图。

祝你好运!

答案 1 :(得分:0)

由于对象可以深度嵌套,您也可以尝试递归,如下所示:

function getList(list, target){                          
  var index = target[0] - 1;        

  if (target.length === 1) return list[index];            

  return getList(list[index].list, target.slice(1));
}

// invoke : var sublist = getList(obj.list, [3, 1]);
//  sublist.push({});