2014-07-13 53 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