2011-06-20 60 views
1

我正在解析json對象數組,以便如果value ='y',鍵的列表將作爲逗號分隔列表返回,該列表是將以html形式返回的變量。按索引位置解析json對象數組

我想通過索引位置引用鍵/值對,因爲我只想返回鍵/值#13-39的值。

任何關於最佳方式的建議是?

我已經有一個jQuery的地圖功能,通過(即,obj.address)來訪問一些屬性。但我還沒有能夠成功地使用過濾器或grep來只選擇具有特定鍵名稱或索引位置的對象屬性。

這是陣列的樣子:

[{"Name": "Name1", "Key1": "Y", "Key2": "Y", "Key3": "N", "Key4": "Y", "Key5": "N"}, 
{"Name": "Name2", "Key1": "N", "Key2": "Y", "Key3": "Y", "Key4": "N", "Key5": "N"}, 
{"Name": "Name3", "Key1": "N", "Key2": "Y", "Key3": "Y", "Key4": "Y", "Key5": "Y"}} 

感謝您的幫助!

+0

哪個值應該是「Y」?您在示例代碼中提供了幾個。爲了讓您以您表達的方式呈現數據,應該是什麼「Y」? –

+0

應顯示任何值爲'y'的鍵。因此,逗號分隔的列表將是,即對於數組中的第一個對象:「Key1,Key2,Key4」 – sharpiemarker1

+0

給定示例數組的期望輸出是什麼?應該是這樣的:'Name1:Key1,Key2,Key4; Name2:Key2,Key3; Name3:Key2,Key3,Key4,Key5'? – Xint0

回答

0

我想你可以想出一些使用jQuery的$.map來做到這一點的方法,但是我個人覺得在純JavaScript方式下更容易。 (請注意,如果你的鑰匙實際上並不命名"Key1""Key2"等,但要訪問關聯數組通過自己的位置的鑰匙,這沒有任何可靠的跨瀏覽器的實現。):

var bar = [ 
    {"Name": "Name1", "Key1": "Y", "Key2": "Y", "Key3": "N", 
        "Key4": "Y", "Key5": "N"}, 
    {"Name": "Name2", "Key1": "N", "Key2": "Y", "Key3": "Y", 
        "Key4": "N", "Key5": "N"}, 
    {"Name": "Name3", "Key1": "N", "Key2": "Y", "Key3": "Y", 
        "Key4": "Y", "Key5": "Y"} 
]; 
var parsed = {}; // this contains the result 
var MIN_KEY = 2; // set to 13 for your request 
var MAX_KEY = 4; // set to 39 for your request 

for (var i = 0, iLen = bar.length; i < iLen; i++) { 
    var baz = bar[i]; 
    var name; 
    var temp = []; 
    for (var key in baz) { 
    var keyNum = parseInt(key.replace("Key", "")); 

    // Get the name or add valid key to an array 
    if (key === "Name") { 
     name = baz[key]; 
    } else if (baz[key] === "Y" && keyNum >= MIN_KEY && keyNum < MAX_KEY) { 
     temp.push(key); 
    } 
    } 

    // Concatenates temp array like "Key1, Key2, Key3" 
    parsed[name] = temp.join(", "); 
} 

console.log(bar); 
console.log(parsed); 

通過計數鍵的替代實現(請注意,這可能不適用於所有瀏覽器):

for (var i = 0, iLen = bar.length; i < iLen; i++) { 
    var counter = 0; 
    var baz = bar[i]; 
    var name; 
    var temp = []; 
    for (var key in baz) { 
    if (key === "Name") { 
     name = baz[key]; 
    } else if (baz[key] === "Y" && counter >= MIN_KEY && counter < MAX_KEY) { 
     temp.push(key); 
    } 
    counter++; 
    } 
    parsed[name] = temp.join(", "); 
} 
+0

好的 - 是的 - 他們實際上並沒有命名爲Key1,Key2等。因此,沒有可靠的跨瀏覽器方式通過索引位置訪問它們? – sharpiemarker1

+0

不是。 [這裏有一些更多的信息](http://stackoverflow.com/questions/6316618/do-javascript-arrays-and-objects-have-a-set-order/6316786#6316786)你可以使用'for'循環上面並使用一個計數器變量(請參閱我的上面的編輯),然後測試,如果你想,只要記住,沒有真正的標準,事情可能無法正常工作。 – brymck

+0

好的 - 非常感謝那個鏈接。我想知道爲什麼看起來事情不斷地半隨機地回來......現在我知道了。謝謝你的幫助。 – sharpiemarker1