Lodash create collection from duplicate object keys

前端 未结 3 1014
轻奢々
轻奢々 2020-12-04 00:35

I have the following structure:

var output = [{
    \"article\": \"BlahBlah\",
    \"title\": \"Another blah\"
}, {
    \"article\": \"BlahBlah\",
    \"titl         


        
相关标签:
3条回答
  • 2020-12-04 00:48

    Use _.groupBy and then _.map the resulting object to an array of objects.

    var newOutput = _(output)
        .groupBy('article')
        .map(function(v, k){ return { article: k, titles: _.map(v, 'title') } })
        .value();
    

    var output = [{"article":"BlahBlah","title":"Another blah"},{"article":"BlahBlah","title":"Return of the blah"},{"article":"BlahBlah2","title":"The blah strikes back"},{"article":"BlahBlah2","title":"The blahfather"}];
    
    let newOutput = _(output)
        .groupBy('article')
        .map(function(v, k){ return { article: k, titles: _.map(v, 'title') } })
        .value();
    
    console.log(newOutput);
    <script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

    With ES6 arrow-functions,

    var newOutput = _(output)
        .groupBy('article')
        .map((v, k) => ({ article: k, titles: _.map(v, 'title') }))
        .value();
    
    0 讨论(0)
  • 2020-12-04 00:50

    A proposal in plain Javascript

    It uses a IIFE (Immediate Invoked Function Expression) for using private variables and for collecting the return values in an array.

    Beside that it uses a hash table for the reference to the right array item.

    var output = [{ article: "BlahBlah", title: "Another blah" }, { article: "BlahBlah", title: "Return of the blah" }, { article: "BlahBlah2", title: "The blah strikes back" }, { article: "BlahBlah2", title: "The blahfather" }],
        newOutput = function (data) {
            var r = [];
            data.forEach(function (a) {
                if (!this[a.article]) {
                    this[a.article] = { article: a.article, titles: [] };
                    r.push(this[a.article]);
                }
                this[a.article].titles.push(a.title);
            }, Object.create(null));
            return r;
        }(output);
            
    console.log(newOutput);

    0 讨论(0)
  • 2020-12-04 01:03

    A better lodash version could be (using the awesome chaining approach)

    _(a).groupBy('article').map( (x,k) => ({ article: k, titles:_.map(x, 'title')}) ).value();  
    

    If you want to group by article (so article would be the key, useful for quick lookup)

    _(a).groupBy('article').mapValues(x => _.map(x, 'title')).value();
    
    0 讨论(0)
提交回复
热议问题