从函数参数访问对象

时间:2016-01-28 17:28:38

标签: javascript arrays function

我试图自己做,但我不知道这是否可能

function smth(){
  var temp = [];
  for(var i = arguments.length -1; i > 2; i-=1){
    var temp2 = [];
    temp.push(arguments[i]);
    temp2.push(temp);
    temp = temp2;
    console.log(temp);
  }
  // I need to get array in this form 
  var something = item['collections']['0']['name'];
}
smth('collection','0','name');

编辑:

好吧,也许我没有给你足够的信息。 我有一个JSON对象,我正在制作一个过滤函数,我想让它更可重用,因为现在我有了硬编码item.collections[0].name, 有时我需要使用item.parameters.name,我会再使用它几次

$scope.$watch(name, function (newValue, oldValue) {
  if (newValue !== oldValue) {
    $scope.productsChucks = myFilter(array, function(item) {
      //console.log(item['collections']['0']['name']);
      if (item.collections[0].name == $scope[compareWith]) {
        return item;
      }
    });
  }
});

2 个答案:

答案 0 :(得分:1)

我认为你说的问题完全错了,恕我直言,这是一个典型的XY问题https://meta.stackexchange.com/a/66378

无论如何,基于你的编辑,我认为你真正想要的是使用"item.parameters.name"形式的字符串来获取对象的一些嵌套属性。

最简单的方法是使用某种辅助库,例如。 lodash

_.get(item, 'parameters.name') // returns item.parameters.name
_.get(item, 'collections[0].name') // returns item.collections[0].name

使用它代码看起来类似于:

// path is a string given as the parameter to the filter
if (_.get(item, path) === $scope[compareWith]) {
    return item;
}

您的函数smth现在只能使用一个参数:

smth('collection[0].name');

有关lodash的更多信息,请访问https://lodash.com/docs#get

如果您认为自己不需要完整的lodash,那么您可以自己实现这一功能,请查看https://stackoverflow.com/a/6491621/704894

答案 1 :(得分:0)

如果您需要以这种方式访问​​它:

var something = item['collections']['0']['name'];

然后它不是一个数组,而是一个用索引表示法访问的对象。你可以这样做:

function smth() {
    var temp = {};
    var root = temp;
    for (var i = 0; i < arguments.length; i++) {
        temp[arguments[i]] = {};
        temp = temp[arguments[i]];
    }
    return root;
}

console.log(JSON.stringify(smth('collection', '0', 'name'), null, 2));