使用JavaScript在二维数组中添加值

使用JavaScript在二维数组中添加值,javascript,Javascript,我要合并并添加以下二维阵列: var arr = [ ["TWENTY", 20], ["TWENTY", 20], ["TWENTY", 20], ["TWENTY", 20], ["TEN", 10], ["FIVE", 5], ["ONE", 1], ["QUARTER", 0.25], ["QUARTER", 0.25], ["DIME", 0.1], ["DIME", 0.1], ["PEN

我要合并并添加以下二维阵列:

var arr = [
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TEN", 10],
    ["FIVE", 5],
    ["ONE", 1],
    ["QUARTER", 0.25],
    ["QUARTER", 0.25],
    ["DIME", 0.1],
    ["DIME", 0.1],
    ["PENNY", 0.01],
    ["PENNY", 0.01],
    ["PENNY", 0.01],
    ["PENNY", 0.01]
    ];
生成如下所示的二维阵列:

 arr = [
     ["TWENTY", 80],
     ["TEN", 10],
     ["FIVE", 5],
     ["QUARTER", 0.50],
     ["DIME", 0.20],
     ["PENNY", 0.04]
     ];

基本上,我把数值相加,然后压缩字符串值。我尝试了map、reduce和for循环,但这一次我遇到了难题。

您有一个带有
键、值
元组的数组。您可以迭代这些元组,将每个新键存储在一个对象中,并在使用同一键访问后续元组时增加值。如果按遇到键的顺序保留键数组,则可以将键数组映射到结果数组

但是,如果你可以使用Nit的答案中所示的纯功能性方法,那么去制造这些麻烦是愚蠢的

下面是丑陋的方法。不要这样做。照尼特说的做

函数addArray(元组){
var hash={},
键=[];
forEach(函数(tuple){//迭代[key,value]元组。
var key=tuple[0],
值=元组[1];
如果(hash[key]===未定义){//这是一个新键吗?
keys.push(key);//然后将其添加到keys。
hash[key]=value;//并设置初始值。
}否则{
hash[key]+=value;//否则,增加值。
}
});
returnkeys.map(函数(键){//将键映射到元组。
返回([key,hash[key]]);
});
};
var arr=[
[“二十”,20],
[“二十”,20],
[“二十”,20],
[“二十”,20],
[“十”,10],
[“五”,5],
[“一”,1],
[“季度”,0.25],
[“季度”,0.25],
[“一角”,0.1],
[“一角”,0.1],
[“便士”,0.01],
[“便士”,0.01],
[“便士”,0.01],
[“便士”,0.01]
];
添加的var=addArray(arr);
added.forEach(函数(元组){
document.write(JSON.stringify(tuple)+'
';
});您真正需要的只是一个reduce和一个map,这可能是一个很好的笑话


到目前为止你试过什么?我的意思是,给我们看一些代码。写一个for循环来迭代array1,然后在for循环中,使用一个开关,然后用array1中相应的值递增指定的array2项。@MichaelLaszlo感谢这个捕获,可能没有注意到,因为代码仍然适用于整数。但是,它会因浮动而中断。修正。顺便说一句,
|
也不会添加整数。@MichaelLaszlo是的,可以在控制台中确认。输入错误之所以能起作用,首先是因为您可以使用二进制操作
|0
在Javascript中将内容转换为整数,就像您可以通过使用
|0
确保某个内容是数字一样。我不明白您的意思<代码>(2 | 2)==2
<代码>2+2==4。哦,我知道你的困惑是从哪里来的了。在上面的代码中,这不是它的本意。加号用于将结果相加。执行
foo | | 0
可确保结果是一个数字,无论foo之前是否未定义。这允许我们避免
未定义+2==NaN
,相反,我们有
(未定义| 0)+2==2
。对于给定的foo是未定义的,
(未定义的| 0)+2==2,同样适用,但仅适用于整数,因为
(2.5 | 0)==2
var arr = [
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TWENTY", 20],
    ["TEN", 10],
    ["FIVE", 5],
    ["ONE", 1],
    ["QUARTER", 0.25],
    ["QUARTER", 0.25],
    ["DIME", 0.1],
    ["DIME", 0.1],
    ["PENNY", 0.01],
    ["PENNY", 0.01],
    ["PENNY", 0.01],
    ["PENNY", 0.01]
];
var obj = arr.reduce(function (out, el) {
    out[el[0]] = (out[el[0]] || 0) + el[1];
    return out;
}, {});
var out = Object.keys(obj).map(function (key) {
    return [key, obj[key]]
}); //[["TWENTY",80],["TEN",10],["FIVE",5],["ONE",1],["QUARTER",0.5],["DIME",0.2],["PENNY",0.04]]