基于javascript中键的聚合总和

时间:2019-04-07 18:21:25

标签: javascript

我有一个看起来像这样的对象数组

var data = [];
    data[0] = {'TrueDestination': 'EU.UK.London',    'EU.UK.London':5, 'EU.UK.Bath':4, 'EU.France.Lyon':1,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':4},
    data[1] = {'TrueDestination': 'EU.UK.Bath',      'EU.UK.London':7, 'EU.UK.Bath':1, 'EU.France.Lyon':8,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':1},
    data[2] = {'TrueDestination': 'EU.France.Paris', 'EU.UK.London':2, 'EU.UK.Bath':2, 'EU.France.Lyon':2,  'EU.France.Paris':6,  'Asia.Japan.Tokyo':3},
    data[3] = {'TrueDestination': 'EU.France.Lyon',  'EU.UK.London':9, 'EU.UK.Bath':0, 'EU.France.Lyon':1,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':2},
    data[4] = {'TrueDestination': 'EU.France.Lyon',  'EU.UK.London':2, 'EU.UK.Bath':4, 'EU.France.Lyon':3,  'EU.France.Paris':7,  'Asia.Japan.Tokyo':7},

我想

  • 将函数应用于数据中对象的键,以便删除点分隔的字符串。因此,例如,从London中除去UK.LondonEU.UK.London,而不是从UKUK.London中除去EU.UK.London(在T.J. Crowder的评论后添加:为避免混淆,您删除了倒退)
  • 然后,对于每个对象,采用键分组的总和

例如,如果我剥离了城市,即字符串中的最后一位,我想以数组结尾

 var data = [];
    data[0] = {'TrueDestination': 'EU.UK',     'EU.UK':9, 'EU.France':1,  'Asia.Japan':4},
    data[1] = {'TrueDestination': 'EU.UK',     'EU.UK':8, 'EU.France':8,  'Asia.Japan':1},
    data[2] = {'TrueDestination': 'EU.France', 'EU.UK':4, 'EU.France':8,  'Asia.Japan':3},
    data[3] = {'TrueDestination': 'EU.France', 'EU.UK':9, 'EU.France':1,  'Asia.Japan':2},
    data[4] = {'TrueDestination': 'EU.France', 'EU.UK':6, 'EU.France':10, 'Asia.Japan':7},

我写这是为了剥离钥匙

    function stripper(d, k){
    // k controls how many times you want to strip the string
    for (i=0; i<k; ++i){
        if (d.lastIndexOf('.') > 0){
            d = d.substring(0, d.lastIndexOf('.'))
        }
    }
    return d
   }

但是我在按键上起作用的功能实在令人尴尬。 (并且不起作用!)无论如何,这是我到目前为止的地方

        stripLevel = 1
    columnNames = data.columns.map(d => stripper(d, stripLevel))

    for (j=0; j<columnNames.length; ++j){
            cname = columnNames[j];
            for (i=0; i<data.length; ++i) {
                var _obj = {}
                obj = data[i]
                _keys = Object.keys(obj)
                total = 0
                for (k = 0; k < _keys.length; ++k) {
                    cur = _keys[k]
                    if ((cname != 'model_class') && (stripper(cur, stripLevel) === cname)) {
                        total += parseFloat(obj[cur])
                    }
                    _objTemp = {[stripper(cur, stripLevel)]: total}
                    Object.assign(_obj, _objTemp)
                    total = 0
                }
            }
    }

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:4)

您可以创建新对象并添加相同键的值。

它与对象的条目和已解构的键/值对k / v一起使用,并且具有获取点缀字符串的第一部分和检查键的功能。

>

如果键k等于TrueDestination,则它将获取未更改的键并为其分配已更改的值。在所有其他情况下,它会使用新的键或零来获取属性的值,然后将该值相加并将其总和分配给该属性。

最后,对象被返回。

var data = [{ TrueDestination: 'EU.UK.London', 'EU.UK.London': 5, 'EU.UK.Bath': 4, 'EU.France.Lyon': 1, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 4 }, { TrueDestination: 'EU.UK.Bath', 'EU.UK.London': 7, 'EU.UK.Bath': 1, 'EU.France.Lyon': 8, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 1 }, { TrueDestination: 'EU.France.Paris', 'EU.UK.London': 2, 'EU.UK.Bath': 2, 'EU.France.Lyon': 2, 'EU.France.Paris': 6, 'Asia.Japan.Tokyo': 3 }, { TrueDestination: 'EU.France.Lyon', 'EU.UK.London': 9, 'EU.UK.Bath': 0, 'EU.France.Lyon': 1, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 2 }, { TrueDestination: 'EU.France.Lyon', 'EU.UK.London': 2, 'EU.UK.Bath': 4, 'EU.France.Lyon': 3, 'EU.France.Paris': 7, 'Asia.Japan.Tokyo': 7 }],
    result = data.map(o => Object.entries(o).reduce((o, [k, v]) => {
        const firsts = k => k.split('.').slice(0, -1).join('.');
        if (k === 'TrueDestination') {
            o[k] = firsts(v);
        } else {
            k = firsts(k);
            o[k] = (o[k] || 0) + v;
        }
        return o;
    }, {}));

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