lodash: mapping array to object

前端 未结 8 2232

Is there a built-in lodash function to take this:

var params = [
    { name: \'foo\', input: \'bar\' },
    { name: \'baz\', input: \'zle\' }
];
相关标签:
8条回答
  • 2020-12-23 14:41

    This is probably more verbose than you want, but you're asking for a slightly complex operation so actual code might be involved (the horror).

    My recommendation, with zipObject that's pretty logical:

    _.zipObject(_.map(params, 'name'), _.map(params, 'input'));
    

    Another option, more hacky, using fromPairs:

    _.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
    

    The anonymous function shows the hackiness -- I don't believe JS guarantees order of elements in object iteration, so callling .values() won't do.

    0 讨论(0)
  • 2020-12-23 14:43

    Another way with lodash

    creating pairs, and then either construct a object or ES6 Map easily

    _(params).map(v=>[v.name, v.input]).fromPairs().value()

    or

    _.fromPairs(params.map(v=>[v.name, v.input]))

    Here is a working example

    var params = [
        { name: 'foo', input: 'bar' },
        { name: 'baz', input: 'zle' }
    ];
    
    var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value();
    
    console.log(obj);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

    0 讨论(0)
  • 2020-12-23 14:50

    Another way with lodash 4.17.2

    _.chain(params)
        .keyBy('name')
        .mapValues('input')
        .value();
    

    or

    _.mapValues(_.keyBy(params, 'name'), 'input')
    

    or with _.reduce

    _.reduce(
        params,
        (acc, { name, input }) => ({ ...acc, [name]: input }),
        {}
    )
    
    0 讨论(0)
  • 2020-12-23 14:53

    This seems like a job for Object.assign:

    const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
    

    Edited to wrap as a function similar to OP's, this would be:

    const toHash = (array, keyName, valueName) => 
        Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
    

    (Thanks to Ben Steward, good thinking...)

    0 讨论(0)
  • 2020-12-23 14:53

    It can also solve without using any lodash function like this:

    let paramsVal = [
        { name: 'foo', input: 'bar' },
        { name: 'baz', input: 'zle' }
    ];
    let output = {};
    
    paramsVal.forEach(({name, input})=>{
      output[name] = input;
    })
    
    
    console.log(output);
    

    0 讨论(0)
  • 2020-12-23 14:56

    You can use one liner javascript with array reduce method and ES6 destructuring to convert array of key value pairs to object.

    arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
    
    0 讨论(0)
提交回复
热议问题