2017-08-07 120 views
1

用戶將填寫一張數據表,然後我需要迭代表格,將他的id組分組,並確保每個組===檢查jquery匹配鍵的對象數組。 + =如果匹配,則新對象

我的計劃是循環遍歷錶行,使key:value對象,檢查數組是否匹配鍵。如果鍵匹配,則將該值添加到現有的數組對象。如果不匹配,請推新項目。

假設此陣:

var gidArr = 
[ 
    { 
     gid: '123', 
     ratio: '20' 
    }, 
    { 
     gid: '123', 
     ratio: '40' 
    }, 
    { 
     gid: '432', 
     ratio: '50' 
    }, 

] 

的結果應該是:

{ gid:123, ratio:60 }, 
{ gid:432, ration: 50} 

兩件事情我已經嘗試:

function GIDRatio(gid, ratio) { 
    this.gid = gid; 
    this.ratio = parseFloat(ratio); 
} 
     var item = new GIDRatio(gid, ratio); 

1: 
     if(gid in gidArr) { 
      gidArr.ratio += item.ratio; 
     } else { 
      gidArr.push(item); 
     } 

2: 

    $.each(gidArr, function(i, v) { 
     if(v.gid === item.gid) { 
      v.ratio += item.ratio; 
     } else { 
      gisArr.push(item); 
     } 
    }) 

小提琴:https://jsfiddle.net/8vw4eehs/11/

回答

2

可以使使用Array.reduce將原始數組轉換爲新結構的方法。

在您的reduce功能中,只需檢查accaccumulated array是否已有gid。如果沒有,然後推入陣列。如果是,則計算總數ratio並更新ratio

var gidArr = 
 
[ 
 
    { 
 
     gid: '123', 
 
     ratio: '20' 
 
    }, 
 
    { 
 
     gid: '123', 
 
     ratio: '40' 
 
    }, 
 
    { 
 
     gid: '432', 
 
     ratio: '50' 
 
    }, 
 

 
]; 
 

 
const newArr = gidArr.reduce((acc, cur) => { 
 
    if(acc.some(x => x.gid === cur.gid)) { 
 
    acc.map(x => { 
 
     if(x.gid === cur.gid) { 
 
     x.ratio = (+x.ratio) + (+cur.ratio); 
 
     } 
 
     return x; 
 
    }); 
 
    } else { 
 
    acc.push(cur); 
 
    } 
 
    return acc; 
 
},[]) 
 

 
console.log(newArr);

+0

非常感謝,一直在我的頭上磕了一會兒。我不承認人們正在回答的方法,所以看起來我需要購買一本新的jquery書籍並做更多的閱讀。 – BattlFrog

0

使用Array.prototype.reduce隱蔽到hashtable,然後積累ratio - 見下面的演示:

var gidArr=[{gid:'123',ratio:'20'},{gid:'123',ratio:'40'},{gid:'432',ratio:'50'}]; 
 

 
var hash = gidArr.reduce(function(p,c){ 
 
    if(p[c.gid]) 
 
    p[c.gid].ratio += +c.ratio; 
 
    p[c.gid] = p[c.gid] || c; 
 
    p[c.gid].ratio = +p[c.gid].ratio; 
 
    return p; 
 
},Object.create(null)) 
 

 
var result = Object.keys(hash).map(function(e){ 
 
    return hash[e]; 
 
}); 
 
console.log(result);

0

var gidArr = [ 
 
    {gid: '123', ratio: '20'}, 
 
    {gid: '123', ratio: '40'}, 
 
    {gid: '432', ratio: '50'}, 
 
    {gid: '123', ratio: '40'} 
 
]; 
 

 
/* Creating an array of objects */ 
 

 
var obj = gidArr.reduce((a,b) => (a[b.gid] = b.gid in a ? a[b.gid]+(+b.ratio):(+b.ratio), a),{}); 
 
var arr = Object.keys(obj).map(x => ({[x]:obj[x]})); 
 

 
console.log(arr, "\n---------------------------") 
 

 
/* Filtering based on values being 100 */ 
 

 
var result = arr.filter(o => Object.values(o)[0] === 100); 
 
console.log(result)
.as-console-wrapper {max-height: 100%!important; top: 0}