2013-06-26 126 views
0

我目前有一些問題從數組中獲取不同的值列表。在數組中存在檢查密鑰

我所尋找的東西,這將使我DISTICT值的計數形式

我有一個項目

[{"Office":"abc", "Name":"ABC", "Total":0}, 
{"Office":"def", "Name":"DEF", "Total":11}, 
{"Office":"def", "Name":"DEF", "Total":1}, 
{"Office":"ghi", "Name":"GHI", "Total":1111}] 

,我期待下列輸出以下數組,它是一個明確的辦事處清單,每個辦事處的實例數量。

[ 
    {"office":"abc","count":1}, 
    {"office":"def","count":2}, 
    {"office":"ghi","count":1} 
] 

我曾嘗試以下是

ko.utils.arrayForEach(officeLines, function (item, indx) 
{ 
    var office = item.Office; 
    if (test[office] == null) 
    { 
     test.push({ office: office, count: 1 }); 
    } 
    else 
    { 
     test["office"][office] += 1; 
    } 
}); 

但是這讓我對原來的陣列中的每個Office一個項目。

+0

@FelixKling是它確實做到了。我只注意到了這一點。它是一個頁面的原型而不是真正的想法。 – Qpirate

回答

6

看起來您需要字典或散列來創建獨特辦公室列表,然後將其轉換爲數組以供最終結果使用。

在您的代碼中,您將數組語法與關聯數組(語法對象)語法混淆在一起。

差異舉例:

var array = []; 
array[0] = { bar: 'foo' }; // note the numeric index accessor/mutator 

var obj = {}; 
obj['property'] = { bar: 'foo' }; // the brackets serve as a property accessor/mutator 

要修復代碼:

var hash = {}; // object literal 
ko.utils.arrayForEach(officeLines, function (item, indx) { 
    var office = item.Office; 
    if (!hash.hasOwnProperty(office)) { 
     hash[office] = { office: office, count: 1 }; 
    } 
    else { 
     hash[office].count++; 
    } 
}); 

// make array 
var test = []; 
for(var office in hash) 
    if(hash.hasOwnProperty(office)) 
     test.push(hash[office]); 
+0

在上一節中,因爲您正在循環訪問您知道的屬性,是不是不需要'hasOwnProperty'部分? –

+0

@Josiah Ruddell你有一​​個小錯誤,在第4行應該是!hash.hasOwnProperty(office)而不是!test.hasOwnProperty – Aguardientico

+0

@Aguardientico - 謝謝,修正。 –

-1

怎麼樣,而不是推的結果,你把他們的數組對象,像這樣:

var officeLines = [{"Office":"abc", "Name":"ABC", "Total":0}, 
{"Office":"def", "Name":"DEF", "Total":11}, 
{"Office":"def", "Name":"DEF", "Total":1}, 
{"Office":"ghi", "Name":"GHI", "Total":1111}]; 
var offices = {}; 
ko.utils.arrayForEach(officeLines, function (item, indx) 
{ 
    var office = item.Office; 
    if (!offices[office]) 
    { 

     offices[office] = 1; 
    } 
    else 
    { 
     offices[office]++; 
    } 
}); 

document.write(JSON.stringify(offices)); // -> {"abc":1,"def":2,"ghi":1} 

http://jsfiddle.net/zd5Db/

+0

這也是不正確的。 –

+0

@FelixKling謝謝我修改併發布了jsfiddle。 – bluetoft

+0

我會刪除不正確的代碼。 –

0

什麼這樣的事情?

var test = {}; 
ko.utils.arrayForEach(officeLines, function (item, indx) 
{ 
    var office = item.Office; 
    if (typeof test[office] === "undefined") 
    { 
     test[office] = 1; 
    } 
    else 
    { 
     test[office]++; 
    } 
}); 
// back to array 
var array = []; 
for (var office in test) { 
    array.push({ office: office, count: test[propertyName] }); 
} 

我想你可能沒有轉換回一個數組,因爲你也許可以在knockoutjs使用$索引來獲取辦公室的名稱,然後$數據爲計數在foreach。

0
var officeLines = [{"Office":"abc", "Name":"ABC", "Total":0}, 
        {"Office":"def", "Name":"DEF", "Total":11}, 
        {"Office":"def", "Name":"DEF", "Total":1}, 
        {"Office":"ghi", "Name":"GHI", "Total":1111}]; 

var test = {}; 

for (office_idx in officeLines) { 
    var office = officeLines[office_idx]; 
    if (test[office['Office']]) { 
     test[office['Office']]['count'] += 1; 
    } else { 
     test[office['Office']] = {office: office, count: 1}; 
    } 
} 
var results = [] 
for (office_id in test){ 
    results.push(test[office_id]); 
} 
2

你似乎是混合陣列和這裏的對象。

if (test[office] == null) 

將測試陣列test是否有一個屬性abcdef等因爲陣列不具有這樣的特性這個條件總是爲真。您通常將數字屬性添加到數組,例如,與.push一樣,你也是如此。

對象另一方面可以有任意的屬性。

現在關於:

test["office"][office] += 1; 

此訪問陣列的屬性office(不存在),然後,屬性abcdef等(這當然不存在任一中,由於test.office確實不存在於第一位)。


您必須決定是否要test爲數組或對象。
如果您選擇一個對象,聚合數據將變得更加容易,因爲您可以輕鬆測試對象屬性的存在。
如果您想要一個數組,您可以將該對象轉換爲數組,或者如果從頭開始使用該數組,則必須遍歷數組的元素並找到合適的數組。該解決方案不太可取,因爲運行時將是O(n^2)

對象:

var test = {}; 

ko.utils.arrayForEach(officeLines, function (item, indx) { 
    var office = item.Office; 
    if (!test[office]) { 
     hash[office] = 1 
    } 
    else { 
     hash[office] += 1; 
    } 
}); 

test那麼會是什麼樣子:

{ 
    abc: 1, 
    def: 2, 
    ghi: 1 
} 

,它會很容易喜歡你想讓它創建一個數組。

陣:

var test = []; 

ko.utils.arrayForEach(officeLines, function (item, indx) { 
    var office = item.Office; 
    for (var i = 0, l = test.length; i < l; i++) { 
     if (test[i].office === office) { 
      test[i].count += 1; 
      return; 
     } 
    } 
    test.push({office: office, count: 1}); 
}); 

我希望你已經可以從嵌套循環(forforEach),這不是一個最佳的解決方案看。


延伸閱讀材料: