2017-09-24 60 views
-1

我的代碼中有一個對象數組。對象具有不同或相同值的相同鍵。JavaScript - 總結對象數組中不同對象的相同ID的值

 var a = []; 
     a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
     a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'20.00'}); 
     a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
     a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'75.00'}); 
     console.log(a); 

數組看起來如下:

enter image description here

我想通過這個數組迭代,如果taxid是在對象相同,則tax_value應該總結。

我試過使用兩個for循環,它正在工作,但在這種情況下,它正在檢查自身的id並與自身進行總結。像如下:

var sum = 0; 
var newArray = []; 
for (var i=0; i<a.length;i++){ 
    for (var j=0;j<a.length;j++){ 
     if(a[i]['taxid']==a[j]['taxid']){ 
      sum = a[i]['tax_value'] + a[j]['tax_value']; 
     } 
    } 
    newArray.push({taxid : a[i]['taxid'], tax_value : sum}); 
} 

我感謝您的關注,謝謝。

+2

請發表您的兩個'for'循環。 –

+0

好吧..我正在更新這個問題 –

回答

1
var output = a.reduce((final,data) => { 
let isAlready = final.find((value) => { 
    value.taxid == data.taxid; 
}); 
if(!isAlready){ 
    final.push(data); 
} else { 
    var index = final.indexOf(isAlready); 
    final[index].tax_value = parseFloat(final[index].tax_value) + parseFloat(data.tax_value); 
} 
return final; 
},[]) 
+1

改變比較回調函數中的值不是一種好的編碼風格。這是一個快速而骯髒的解決方案,但對於如此簡單的代碼片段來說並不是必需的。它違背了'find'函數的意義。沒有downvote,因爲它的工作原理,但我不喜歡的解決方案。 –

+0

謝謝,我剛更新了我的答案。 –

+0

我有點修改它,它的工作,謝謝你.. –

0

您可以通過不同方式實現此目的。

一個AY是使用減少:

a = a.reduce((c, i)=>{c[i.taxid]=(c[i.taxid]||0)+parseFloat(i.tax_value); return c}, {}); 

是,這是太complecated你,你可以使用一個循環:

var t = {}; 
a.forEach((v)=>t[v.taxid]=(t[v.taxid]||0)+parseFloat(v.tax_value)); 
a = t; 
如果表達式太complecated的

,你可以achive這與一個簡單的條件如下:

var t = {}; 
a.forEach((v)=>{ 
    if(t[v.taxid]) 
    t[v.taxid]+=parseFloat(v.tax_value); 
    else 
    t[v.taxid] = parseFloat(v.tax_value); 
}); 
a = t; 

編輯:爲了響應編輯問題和volitionaly輸出: [{taxid : NUM, tax_value : NUM}, ...]

a = a.reduce((c, i)=>{ 
    let cc = c.findIndex((e)=>e.taxid==i.taxid); 
    if(cc==-1) c.push({taxid: i.taxid, tax_value: parseFloat(i.tax_value)}); 
    else c[cc].tax_value += parseFloat(i.tax_value) 
    return c 
}, []); 
0

你可以使用減少,如果你想要得到的結果映射到的值相加在一起

var a = []; 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'20.00'}); 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'75.00'}); 
 

 
let res = a.reduce((a, b) => 
 
    a.set(b.taxid, (a.get(b.taxid) || 0) + Number(b.tax_value)), new Map); 
 

 
console.log(res);

一個物體,你可以用

toObject(map) { 
    let obj = Object.create(null); 
    for (let [key, value] of map.entries()) { 
     obj[key] = value; 
    } 
    return obj; 
} 

console.log(toObject(res)); 
0

我想你想要這樣的東西作爲你的實現。

var a = []; 
 
     a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
     a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'20.00'}); 
 
     a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
     a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'75.00'}); 
 
     
 
//Sum up all the same taxid tax_value 
 
var temp = {}; 
 
a.forEach(function(obj){ 
 
    if(!temp[obj.taxid]){ 
 
    temp[obj.taxid] = obj.tax_value; 
 
    } else { 
 
    temp[obj.taxid] = Number(temp[obj.taxid]) + Number(obj.tax_value); 
 
    } 
 
}); 
 

 
//Format the data into desired output 
 
var result = []; 
 
for(var key in temp){ 
 
    result.push({ 
 
    taxid: key, 
 
    tax_value: temp[key] 
 
    }) 
 
} 
 

 
console.log(result)

0

添加另一條件,你的循環( 「如果」,在第二循環語句)

(a[i]['taxid'] === a[j]['taxid'] && j !== i) 

解釋
如你所說,循環檢查ID本身,爲了防止這種情況,你可以添加「j!== i」的,所以如果第二環路命中從第一環路ID它將越過它,所以它不會總結本身

+0

我認爲這個條件不是循環,而是if語句。您還應該解釋爲什麼此修改可行。 – clemens

+1

我認爲這是很明顯的,應該修改if語句循環,並通過循環我的意思是他的解決方案,這是完全有效的,只需要一點波蘭語,無論如何感謝提示,我真的應該寫爲什麼這是工作 – erhardos

0

這是一個可能的解決方案,它涉及到改變的總和到一個對象,因此var sum = {},然後將總計tax_value添加到任何與其他對象相匹配的id。我嘗試使用您的原始代碼,但請記住有更高效的解決方案。

PS:在if語句中阻止它從檢查'taxid'本身

var a = []; 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'20.00'}); 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'75.00'}); 
 

 
var sum = {}; 
 
var res = 0; 
 
var newArray = []; 
 
for (var i=0; i<a.length;i++){ 
 
    for (var j=0;j<a.length;j++){ 
 
     if(a[i]['taxid']==a[j]['taxid'] && a[i] !== a[j]){ 
 
      sum[a[i]['taxid']] === undefined ? sum[a[i]['taxid']] = 0 : sum[a[i]['taxid']] += parseFloat(a[i]['tax_value']) + parseFloat(a[j]['tax_value']); 
 
     } 
 
    } 
 
} 
 

 
console.log(sum);

0

蛋糕

const a = []; 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'20.00'}); 
 
a.push({taxid : 1, tax_name: 'VAT', tax_value:'25.00'}); 
 
a.push({taxid : 2, tax_name: 'Service Tax', tax_value:'75.00'}); 
 

 

 
const sum = {}; 
 
for (var i = 0; i < a.length; i++) { 
 
const o = a[i]; 
 
const lol = parseFloat(o.tax_value); 
 
sum[o.taxid] = (sum[o.taxid]) ? sum[o.taxid] + lol : lol; 
 
} 
 
console.log(sum);

0

一些注意事項:

  • tax_value是一個字符串。你至少需要一個隱式類型轉換來編號,因爲如果你添加一個數字和一個字符串,數字會被轉換成字符串,你會得到一個字符串連接,但不是一個算術運算。

  • 改變給定的數據結構或創建一個新的數據結構。在這種情況下,通常總是最好生成一個新的結果集,而不是將給定的結構用作數據和結果集。這可能會導致混淆,因爲某些代碼可能會在未改變的結構上進行中繼。

  • 使用哈希表,這可能是在較新的系統(ES6)或用於保持參考同一個對象具有相同taxid對象的Map

  • 使用含有隱含號碼的轉換號碼unary plus +

  • 使用單個循環。

var data = [{ taxid: 1, tax_name: 'VAT', tax_value:' 25.00' }, { taxid: 2, tax_name: 'Service Tax', tax_value: '20.00' }, { taxid: 1, tax_name: 'VAT', tax_value: '25.00' }, { taxid: 2, tax_name: 'Service Tax', tax_value: '75.00' }], 
 
    hash = Object.create(null), 
 
    result = []; 
 

 
data.forEach(function (o) { 
 
    if (!hash[o.taxid]) { 
 
     hash[o.taxid] = { taxid: o.taxid, tax_name: o.tax_name, tax_value: 0 }; 
 
     result.push(hash[o.taxid]); 
 
    } 
 
    hash[o.taxid].tax_value += +o.tax_value; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相關問題