2012-11-13 193 views
2
var name = new Array(); 
var amount = new Array(); 
name[0]="Peter"; 
amount[0]="50"; 
name[1]="John"; 
amount[1]="10"; 
name[2]="John"; 
amount[2]="20"; 
name[3]="Peter"; 
amount[3]="20"; 
name[4]="Mary"; 
amount[4]="40"; 

我有類似上面的內容。我的問題是,如何創建一個函數來消除所有重複項,並對數組中的每個人的值進行總結?以下是我正在尋找的結果。刪除重複項併合計數量

例如:

Peter 70 
John 30 
Mary 40 

回答

2

請嘗試以下

var sum = {}; 
var i; 
for (i = 0; i < amount.length; i++) { 
    var name = name[i]; 
    var oldSum = sum[name]; 
    if (typeof oldSum === 'undefined') { 
    oldSum = 0; 
    } 
    sum[name] = oldSum + amount[i]; 
} 

現在的對象sum將有每一個名稱的屬性在name和財產的價值將是量的總和其名稱爲

要打印出來請嘗試以下內容

for (var prop in sum) { 
    if (sum.hasOwnProperty(prop)) { 
    console.log(prop + " " sum[prop]); 
    } 
} 
+0

謝謝。它很好地工作。如果我想打印姓氏,並且可能總結另一個數組,例如數量? – user1033038

+0

@wvxvw'sum'的值在一個非常有限的範圍內使用,因此我可以放心地斷言'undefined'是一個非法的值。在這個範圍內,它可以有數字值或什麼也沒有。我不明白你的*慢*參數。使用map中的key,然後讀取該值需要每循環迭代2次查找,而我的解決方案有1次查找。 – JaredPar

+0

@JaredPar,如何在另一個數組中添加總和,amount2,例如: name [0] =「Peter」; amount [0] =「50」; amount2 [0] =「20」; name [1] =「John」; amount [1] =「10」; amount2 [1] =「30」; name [2] =「John」; amount [2] =「20」; amount2 [2] =「50」; name [3] =「Peter」; amount [3] =「20」; amount2 [3] =「40」; name [4] =「Mary」; amount [4] =「40」; amount2 [4] =「5」; – user1033038

0

我不能告訴你是否真的想要修改數組,或只是收集結果。

這是一種收集對象結果的方法。

var result = name.reduce(function(res, n, i) { 
    res[n] = (res[n] + +amount[i]) || +amount[i]; 
    return res; 
}, {}); 

.reduce()方法需要爲IE8和更低的墊片。

結果是:

{ 
    "Peter": 70, 
    "John": 30, 
    "Mary": 40 
} 
0
result = {}; 
for(var i=name.length; i--;) { 
    result[name[i]] = result[ name[i] ] ? (result[name[i]] + parseInt(amount[i], 10)) : parseInt(amount[i], 10); 
} 
console.log(result); 

回報

{ Mary=40, Peter=70, John=30 } 

parseInt()僅僅是必要的,因爲你給amount[]值作爲字符串。

result調用後是一個對象,其中保存了求和值,其中關鍵字是來自name[]的條目,值是從amount[]

0
tally=[]; 
for(i=0;i<name.length;i++) { 
    if(tally[name[i]]==undefined){ 
    tally[name[i]]=parseInt(amount[i]); 
    }else{ 
    tally[name[i]]+=parseInt(amount[i]); 
    } 
}