如果条件匹配,则在数组中求和一个参数

时间:2015-12-07 15:46:59

标签: javascript jquery arrays

我有一个数组如下。

    var arr = [
    {'ResId':123,'ResVal':4,'Date':'11/03/2015'},
    {'ResId':123,'ResVal':8,'Date':'11/03/2015'},
    {'ResId':123,'ResVal':4,'Date':'13/03/2015'},
    {'ResId':123,'ResVal':4,'Date':'13/03/2015'},
    {'ResId':223,'ResVal':4,'Date':'12/03/2015'},
    {'ResId':223,'ResVal':2,'Date':'12/03/2015'},
    {'ResId':223,'ResVal':4,'Date':'13/03/2015'},
    {'ResId':765,'ResVal':4,'Date':'13/03/2015'}]

如果ResId和Date匹配,我想总结ResVal的值。 假设在上面的数组中,ResId = 123和Date = 11/03/2015有两个条目,那么我总结它们并创建一个ResId = 123,Date = 11/03/2015和ResVal = 12的条目

我需要这是动态的,因为所有3个参数的值将始终不同。

My Resulting数组应该如下所示

[{'ResId':123,'ResVal':12,'Date':'11/03/2015'},
{'ResId':123,'ResVal':8,'Date':'13/03/2015'},
{'ResId':223,'ResVal':6,'Date':'12/03/2015'},
{'ResId':223,'ResVal':8,'Date':'13/03/2015'}]

此外,我还需要使用纯JS / Jquery来完成。

1 个答案:

答案 0 :(得分:1)

这是包含Array.prototype.reduce()Array.prototype.some()的提案。

var arr = [
        { 'ResId': 123, 'ResVal': 4, 'Date': '11/03/2015' },
        { 'ResId': 123, 'ResVal': 8, 'Date': '11/03/2015' },
        { 'ResId': 123, 'ResVal': 4, 'Date': '13/03/2015' },
        { 'ResId': 123, 'ResVal': 4, 'Date': '13/03/2015' },
        { 'ResId': 223, 'ResVal': 4, 'Date': '12/03/2015' },
        { 'ResId': 223, 'ResVal': 2, 'Date': '12/03/2015' },
        { 'ResId': 223, 'ResVal': 4, 'Date': '13/03/2015' },
        { 'ResId': 765, 'ResVal': 4, 'Date': '13/03/2015' }],
    reduced = arr.reduce(function (r, a) {
        !r.some(function (b) {
            if (a.Date === b.Date && a.ResId === b.ResId) {
                b.ResVal += a.ResVal;
                return true;
            }
        }) && r.push({ ResId: a.ResId, ResVal: a.ResVal, Date: a.Date });
        return r;
    }, []);
document.write('<pre>' + JSON.stringify(reduced, 0, 4) + '</pre>');