在两个级别中使用变量作为键

时间:2014-01-14 14:36:42

标签: javascript

我想创建一个通用函数,我可以从带有对象的数组中打印选定的属性。

http://jsbin.com/iNOMaYo/1/edit?js,console,output

示例:

var contacts = [
    {
      name: 'John',
      address:{
        country:'Germany',
        city:'Berlin'
      }
    },
    {
      name: 'Joe',
      address:{
        country:'Spain',
        city:'Madrid'
      }
    }
]

这是我的职责:

function print(array, key, index){
  console.log(array[index][key]);
}

所以,如果我想要名称,例如:

print(contacts, 'name', 0)

我得到'约翰'。

但如果我想要这座城市怎么办呢?

这是未定义的:

print(contacts, 'address.city', 0)

http://jsbin.com/iNOMaYo/1/edit?js,console,output

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

function print(array, key, index){
  var parts = key.split(".");
  var returnValue = array[index];
  for(var i=0;i<parts.length;i++) {
    returnValue = returnValue[parts[i]];
  }
  console.log(returnValue);
}

答案 1 :(得分:0)

目前我能提出的最好的事情是:

http://jsbin.com/iziFevIg/1/edit?html,js,output

也许别人有更好的主意。

答案 2 :(得分:0)

我的解决方案非常幼稚,我在边缘情况下没有考虑过它,但我是功能编程的粉丝,因此立即(将不可变性放在一边)

function print(array, key, index) {
  var splitted_key, new_key;

  if (key.indexOf(".") !== -1) { 
    splitted_key = key.split(".");
    new_index = splitted_key.shift();
    new_key = splitted_key.join(".");
    print(array[index], new_key, new_index);
  }
  else {
    console.log(array[index][key]);
  }
}

http://jsbin.com/IFeciJIz/2/edit