it-swarm.com.de

lodash: Zuordnung von Array zu Objekt

Gibt es eine eingebaute lodash-Funktion, um dies auszuführen:

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

Und dies ausgeben:

var output = {
    foo: 'bar',
    baz: 'zle'
};

Im Moment verwende ich nur Array.prototype.reduce():

function toHash(array, keyName, valueName) {
    return array.reduce(function(dictionary, next) {
        dictionary[next[keyName]] = next[valueName];
        return dictionary;
    }, {});
}

toHash(params, 'name', 'input');

Ich frage mich, ob es eine Abkürzung für die Lodge gibt.

39
core

ein anderer Weg mit lodash 4.17.2

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

oder

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

oder mit _.reduce

_.reduce(
    params,
    (acc, { name, input }) => ({ ...acc, [name]: input }),
    {}
)
52
stasovlas

Ja es ist hier , mit _.reduce

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

_.reduce(params , function(obj,param) {
 obj[param.name] = param.input
 return obj;
}, {});
24
JagsSparrow

Sie sollten _.keyBy verwenden, um ein Array leicht in ein Objekt zu konvertieren.

Dokumente hier

Verwendungsbeispiel unten:

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

Bei Bedarf können Sie das Array vor der Verwendung von _.keyBy oder dem Objekt nach der Verwendung von _.keyBy bearbeiten, um das genaue gewünschte Ergebnis zu erhalten.

15
danday74

Sie können einen Liner-Javascript mit array redu method und ES6 destructuring verwenden, um ein Array von Schlüsselwertpaaren in ein Objekt zu konvertieren.

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
10
Faisal Hasnain

Es kann auch gelöst werden, ohne eine lodash-Funktion wie folgt zu verwenden: 

let paramsVal = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
let output = {};

paramsVal.forEach(({name, input})=>{
  output[name] = input;
})


console.log(output);

 enter image description here

3

Dies ist wahrscheinlich ausführlicher, als Sie möchten, aber Sie fordern eine etwas komplexe Operation, so dass der tatsächliche Code involviert sein kann (der Horror).

Meine Empfehlung mit zipObject ist ziemlich logisch:

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

Eine andere Option, hackiger, mit fromPairs :

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

Die anonyme Funktion zeigt die Hässlichkeit - ich glaube nicht, dass JS die Reihenfolge der Elemente in der Objektiteration garantiert, so dass das Aufruf von .values() nicht funktioniert.

2
djechlin

Ein anderer Weg mit lodash

erstellen Sie Paare und konstruieren Sie dann entweder ein Objekt oder ES6 Map

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

oder

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

Hier ist ein Arbeitsbeispiel

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>
2

Dies scheint ein Job für Object.assign zu sein:

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

Bearbeitet, um eine Funktion ähnlich wie bei OPs zu binden, wäre dies:

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

(Danke an Ben Steward, gutes Denken ...)

2
RainedColony