簡體   English   中英

通過匯總相同元素來進行JavaScript數組排序

[英]JavaScript array sorting by summing up same elements

嘗試對JavaScript中的數組項進行排序和分組時遇到了麻煩。 這是示例輸入:

var arr = [
{merchantName: '', branchName: 'e', branchAddress: '', total: 10.5},
];

我正在嘗試實現的輸出:

var arr = [
{merchantName: '', branchName: '', branchAddress: '', total: 10.5},
];

我想按branchName對其進行排序,例如,將相同branchName的總數求和,然后同時將所有其他屬性(例如商人名稱和branchAddress)與其綁定在一起,以便我可以像這樣訪問它們:

for(var i = 0; i < arr.length; i++){
            console.log(arr[i].merchantName + ' ' + arr[i].branchName + ' ' + arr[i].branchAddress + ' ' + arr[i].total);
        }

實際上,我什至不知道如何啟動它。 有什么想法要實現嗎?

提前致謝!

所以這是我要怎么做:

  1. 根據branchName屬性將數組分組為一個hashmap branchName -連同它一起計算總數。

  2. hashmap取出數組並對它們進行排序

請參見下面的演示:

 var arr = [ {merchantName: 'Giant', branchName: 'Giant Marine', branchAddress: 'Terrace 56 Branch Blk 56 Marine Terrace #01-259/261 Singapore 440056', total: 10.5}, {merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 12.149999999999999}, {merchantName: 'Giant', branchName: 'Giant Kim Keat 260 Branch', branchAddress: ' Blk 260 Kim Keat Avenue #01-01 Singapore 310260', total: 5.1}, {merchantName: 'Ntuc', branchName: 'Ntuc Scotts Square Branch', branchAddress: ' Scotts Square #B1-03 To 07 & #B1-10, 6 Scotts Road, 228209', total: 4}, {merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 4}, {merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 8} ]; // create a hashmap var hash = arr.reduce(function(p,c){ if(!p[c.branchName]) p[c.branchName] = c; else p[c.branchName].total += c.total; return p; }, Object.create(null)) // now extract the result and sort them var result = Object.keys(hash).map(function(e){ return hash[e]; }).sort(function(a,b){ return a.branchName - b.branchName; }); console.log(result); 
 .as-console-wrapper{top:0;max-height:100%!important;} 

使用reduce()解決方案

 var arr = [{ merchantName: 'Giant', branchName: 'Giant Marine', branchAddress: 'Terrace 56 Branch Blk 56 Marine Terrace #01-259/261 Singapore 440056', total: 10.5 }, { merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 12.149999999999999 }, { merchantName: 'Giant', branchName: 'Giant Kim Keat 260 Branch', branchAddress: ' Blk 260 Kim Keat Avenue #01-01 Singapore 310260', total: 5.1 }, { merchantName: 'Ntuc', branchName: 'Ntuc Scotts Square Branch', branchAddress: ' Scotts Square #B1-03 To 07 & #B1-10, 6 Scotts Road, 228209', total: 4 }, { merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 4 }, { merchantName: 'Ntuc', branchName: 'Ntuc Zhongshan Mall Branch', branchAddress: ' Zhongshan Mall Balestier #02-01, 20 Ah Hood Road, 329984', total: 8 } ]; var newArr = arr.reduce(function(items, item) { var existing = items.find(function(i) { return i.branchName === item.branchName; }); if (existing) { existing.total += item.total; } else { items.push(item); } return items; }, []); console.log(newArr); 

看起來您想做兩件事:按branchName排序,然后為每個branchName輸出一個值(對結果進行重復數據刪除/按branchName分組)。

有兩個潛在的問題。 1)上面顯示的示例輸出未按branchName進行排序,即使您聲明a)您希望按branchName對其進行排序,b)這將是一個示例。 其次,輸出並不完全是確定性的-特別是您似乎只是輸出第一個匹配的記錄形式branchName,因此顯示了total屬性的值-在同一branchName的記錄之間有所不同。 所以...假設您A)希望對結果進行排序,而B)不在乎“總計”屬性的值,則可以通過以下方法輕松完成此操作:

我)排序數組。 有關示例,請參見https://gist.github.com/umidjons/9614157 :只需編寫一個用於比較branchName值的比較函數。 並且,II)遍歷結果,每當branchName從先前的值更改時,僅輸出第一條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM