2012-11-13 142 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]); 
    } 
}