2014-07-13 52 views
0

我的目标是这样的:滤镜阵列状物体

aryControlDef = { 
    'item1' : ['a','b','c'], 
    'item2' : ['x','y','z']  
}; 

然而,当我把这个

var sAtt = 'z'; 
var vControlDef = Array.prototype.filter.call(aryControlDef, function(value) {return value[2] == sAtt}); 

我得到这个:

vControlDef = [] 

我知道这是做按键的类似数组的对象迭代,因为此循环得到正确的结果:

for(var i in aryControlDef){ 
    if(aryControlDef[i][2]=='z'){ 
    vControlDef[aryControlDef[i][0]] = aryControlDef[i]; 
    }; 
}; 

我所追求的是一种返回包含与sAtt匹配的属性的对象的方法。

我无法弄清楚如何迭代回调函数中的键,与'for ... each'循环中可能的方式相同,Google没有找到任何结果这种情况下使用。 TIA对于任何建议:)

- ps。忘了提,我在谷歌Apps脚本这样做,这意味着任何外部库(没有DOM)

- 建议的解决方案1 ​​

var vControlDef = Object.keys(aryControlDef).filter(function(key) { 
    return aryControlDef[key][2] == sAtt; 
}); 

提出了一个非描述谷歌服务器错误“我们很抱歉,发生服务器错误,请稍等一会儿,然后重试。“

+0

得到什么,你的“迭代在回调函数中的关键”的意思是相似? – Whymarrh

+0

您试图在非数组的东西上调用数组方法。它甚至不是一个“类似数组的对象”,它只是一个没有类似数组特征的对象。当然这是行不通的。你不能使用Array的方法来帮助你。你将不得不使用一个你已经提供的简单循环。 – meagar

+1

你的对象不是“类似数组的对象”。在JavaScript中,“类似数组”意味着您的对象必须具有数字索引的属性和一个给出索引上限的“.length”属性。 – Pointy

回答

0

这可能有帮助。

var aryControlDef = { 
    'item1' : ['a','b','c'], 
    'item2' : ['x','y','z']  
}; 

var vControlDef = []; 

for (key in aryControlDef) { 
    if (aryControlDef.hasOwnProperty(key)) { 
     // So now the possible value of 
     // key is 'item1'/'item2' 
     // aryControlDef[key] is ['a','b','c']/['x','y','z'] 

     if (aryControlDef[key][2] == 'z') { 
      vControlDef.push(aryControlDef[key]); 
     } 
    } 
} 

在vControlDef结果应该是什么,你认为你会从

var vControlDef = Array.prototype.filter.call(aryControlDef, function(value) { 
    return value[2] == 'z' 
}); 
+0

但我已经有我的第一篇文章中显示的循环解决方案 - 我希望使用本地方法:) – Tim