简体   繁体   中英

Create an object from another object's group by key using lodash

For the given structure:

[{
    file: [{
        en: 'asset_string_en.jpg'
    }, {
        ch: 'assets_string_ch.jpg'
    }],

    assetName: 'assetName1'
}, {
    file: [{
        en: 'asset_string2_en.jpg'
    }, {
        ch: 'asset_string2_ch.jpg'
    }],

    assetName: 'assetName2'
}]

I want to make an object for each assetName with values grouped by these keys ['en', 'ch']:

{
'assetName1':'asset_string_en.jpg',
'assetName2':'asset_string2_en.jpg'
}

{
'assetName1':'asset_string_ch.jpg',
'assetName2':'asset_string2_ch.jpg'
}

How can I do this with lodash?

In plain Javascript, you could use some loops for creating the result set.

 var data = [{ file: [{ en: 'asset_string_en.jpg' }, { ch: 'assets_string_ch.jpg' }], assetName: 'assetName1' }, { file: [{ en: 'asset_string2_en.jpg' }, { ru: 'asset_string2_ch.jpg' }], assetName: 'assetName2' }], result = []; data.forEach(function (a) { a.file.forEach(function (b, i) { Object.keys(b).forEach(function (k) { result[i] = result[i] || {}; result[i][a.assetName] = b[k]; }); }); }); console.log(result); 

Using es6 fat arrow notation:

var arr = [{
    file: [{
        en: 'asset_string_en.jpg'
    }, {
        ch: 'assets_string_ch.jpg'
    }],

    assetName: 'assetName1'
}, {
    file: [{
        en: 'asset_string2_en.jpg'
    }, {
        ru: 'asset_string2_ch.jpg'
    }],

    assetName: 'assetName2'
}];

_.reduce(arr, (answer, obj)=> {answer[_.get(obj, 'file[0].en')] = _.get(arr[0], 'file[1].ch'); return answer}, {});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM