2017-01-26 69 views
0

這是我的第一個堆棧過低的問題:JavaScript數組複製和值

我得到這個數組[['a',12],['a',21],['b',1],['c',4],['c',5]]

,我想這樣的[['a',33],['b',1],['c',9]]

任何輸出它可以給我一個伸出援助之手?

+0

但第一陣列沒有'33'或'它9'那麼你如何從一個數組希望輸出的東西那不存在.. – NewToJS

+0

問題描述了獲得該結果所需的步驟,還是編碼這些步驟的問題?我假設你想要將所有數字相同的字母相加。 – Shilly

+1

@NewToJS:很明顯,它基於第一個數組項匹配來總結子數組中第二個數組項的值。 –

回答

1

您可以使用散列表引用具有相同內部數組的第一項的相同結果數組。

Array#forEach循環數組並查看該字符串是否已存在於散列表中。如果不是,則分配內部數組的副本並將其推送到結果中,然後退出回調。

如果找到,則將內部數組的值添加到散列表的數組中。

var data = [['a', 12], ['a', 21], ['b', 1], ['c', 4], ['c', 5]], 
 
    hash = Object.create(null), // generate object without prototypes 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    if (!(a[0] in hash)) { 
 
     hash[a[0]] = a.slice(); 
 
     result.push(hash[a[0]]); 
 
     return; 
 
    } 
 
    hash[a[0]][1] += a[1]; 
 
}); 
 

 
console.log(result); 
 
console.log(hash); // to show how it works
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

非常感謝!你是一個拯救生命的人! – ogaitsinid

+0

@ogaitsinid考慮接受並有可能upvote如果它爲你工作的答案。 – Tholle

+0

非常簡單,並對點 –

0

使用Array.reduce

var data = [['a', 12], ['a', 21], ['b', 1], ['c', 4], ['c', 5]]; 

var result = data.reduce(function (a, b, i) { 
    const c = a.filter(function (ax) { return ax[0] === b[0] }); 
    c.length > 0 ? c[0][1] = c[0][1] + b[1] : a.push(b); 
    return a; 
}, []); 

console.log(result); 
// [[a, 33], [b, 1], [c, 9]]