合并数组对象 - lodash

时间:2015-04-28 09:29:07

标签: javascript arrays merge lodash

所以我有一系列这样的项目:

items = [
    {
        amount: 2,
        name: 'bike'
    },
    {
        amount: 1,
        name: 'boat'
    },
    {
        amount: 3,
        name: 'bike'
    }
]

现在,我想合并这个阵列,这样就不会有重复的自行车,但仍然知道总共有多少辆自行车。

所以我的结果数组看起来像这样:

items = [
    {
        amount: 5,
        name: 'bike'
    },
    {
        amount: 1,
        name: 'boat'
    }
]

为了保持我的代码简短,我建议使用lodash并且我一直在研究将数组合并在一起的不同方法。但说实话,找出最好的方法会很困惑,这就是为什么我要问你们^^

2 个答案:

答案 0 :(得分:4)

您可以将.groupBy.map一起使用,_.sum用于计算amount,就像这样

var items = [{
    amount: 2,
    name: 'bike'
}, {
    amount: 1,
    name: 'boat'
}, {
    amount: 3,
    name: 'bike'
}];

var res = _(items)
    .groupBy('name')
    .map(function (el, name) {
        return {
            name: name,
            amount: _.sum(el, 'amount')
        };
    })    
    .value();

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.7.0/lodash.min.js"></script>
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

答案 1 :(得分:2)

如果你不想专门为这个例子加载lodash(不确定额外的50K是值得你在这里使用几行额外的代码)这里是一个香草JS循环遍历各种对象时使用临时对象来保存值的版本:

function merge(items) {
    var tmp = {}, out = [];
    for (var i = 0, l = items.length; i < l; i++) {
        var name = items[i].name;
        var amount = items[i].amount;
        if (!tmp[name]) tmp[name] = 0;
        tmp[name] += amount;
    }
    for (var p in tmp) {
        out.push({ name: p, amount: tmp[p] });
    }
    return out;
}

merge(items); // [{"name":"bike","amount":5},{"name":"boat","amount":1}]

DEMO