2017-08-07 191 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}