2013-07-25 57 views
4

我有以下格式的JSON webservice。如何從對象中獲取數組的數量

{ Name:['a','b'], Name:['cd','ef'], Age:{...}, Address:{...} }. 

這裏我有2陣列& 2對象一個對象和這些(陣列&對象)數量可以變化的內部。我需要的是,如何從主Object中單獨獲取數組的數量?有可能存在另一種方法來解決我的問題,但我需要我的代碼在.JS(JavaScript文件)。


當我試圖:

Object.keys(mainobject).length; 

它給在主對象數組+對象的總數。

+0

你需要IE8的支持? – frenchie

+0

解析JSON,迭代它的屬性併爲其值爲數組的屬性增加一個計數器。 –

+1

我不認爲你可以在同一個對象中有兩個'Name'鍵。 –

回答

4
var data = { Name:['a','b'], OtherName:['cd','ef'], Age:{a: 12}, Address:{a: 'asdf'} } 

var numberOfArrays = Object.keys(data).filter(function(key) { 
    return data[key] instanceof Array; //or Array.isArray(data[key]) if the array was created in another frame 
}).length; 

alert(numberOfArrays); 

注意:這將無法工作在舊版本的IE

jsFiddle

,使其與不支持瀏覽器,使用墊片從MDN:

Object.keys

Array.filter

+0

感謝您的幫助@ c.P.u1。並且可以根據特定的數組名稱進行計數。 – msg

+0

這在舊的IE中不起作用;如果你所服務的都是移動設備,並且新的瀏覽器可能沒問題。 – frenchie

+0

@ user2546074,'filter'中的關鍵參數保存屬性的名稱。例如,如果你想要一個名爲'OtherName'的數組:'return data [key] instanceof Array && key ==='OtherName'' –

0

您可以嘗試檢查對象的每個成員的類型。

var count = 0; 
for (var foo in mainobject) { 
    if (foo instanceof Array) count++; 
} 

現在你需要做的是閱讀的count值。

1

我寫的東西來算所有類型

var obj = { 
    k1: ['a','b'], k2: ['cd','ef'], 
    k3: 0, k4: 1, 
    k5: {a:'b'}, 
    k6: new Date(), 
    k7: "foo" 
}; 

function getType(obj) { 
    var type = Object.prototype.toString.call(obj).slice(8, -1); 
    if (type === 'Object') return obj.constructor.name; 
    return type; 
} 

function countTypes(obj) { 
    var k, hop = Object.prototype.hasOwnProperty, 
     ret = {}, type; 
    for (k in obj) if (hop.call(obj, k)) { 
     type = getType(obj[k]); 
     if (!ret[type]) ret[type] = 1; 
     else ++ret[type]; 
    } 
    return ret; 
} 

var theTypes = countTypes(obj); 
// Object {Array: 2, Number: 2, Object: 1, Date: 1, String: 1} 

現在,如果我想知道的陣列只數

var numArrays = theTypes.Array || 0; // 2 Arrays in this example