Gibt es eine eingebaute Lodash-Funktion, um dies zu übernehmen:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
Und geben Sie Folgendes aus:
var output = {
foo: 'bar',
baz: 'zle'
};
Im Moment benutze 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 Lodash gibt.
javascript
lodash
Ader
quelle
quelle
_.keyBy
wandelt das gesamte Array in ein Objekt um, während die Frage hauptsächlich darin besteht, ein Element von jedem Objekt im Array als Schlüssel und ein anderes Element als Wert zu haben. Wenn_.keyBy
verwendet, sind alle Werte Objekte.Sie sollten _.keyBy verwenden, um ein Array einfach in ein Objekt zu konvertieren.
Docs hier
Anwendungsbeispiel 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 das Objekt nach der Verwendung von _.keyBy bearbeiten, um das genau gewünschte Ergebnis zu erhalten.
quelle
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; }, {});
quelle
reduce()
kommt mit einem anderen Anwendungsfall. Kluge Art, es zu tun!_.reduce
es nur, wenn dies genau ausdrückt, was Sie tun möchten: In anderen Fällen wird der Punkt des Codes erheblich verdeckt. Ich persönlich bevorzuge die_.zipObject
Lösung von @djechlin - andernfalls den_.keyBy
/_.mapValues
-Ansatz.Dies scheint ein Job für Object.assign zu sein:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Bearbeitet, um als Funktion ähnlich wie OPs zu verpacken, wäre dies:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Danke an Ben Steward, gutes Denken ...)
quelle
Sie können einzeiliges Javascript mit Array-Reduktionsmethode und ES6-Destrukturierung verwenden , um ein Array von Schlüsselwertpaaren in ein Objekt zu konvertieren.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
quelle
Dies ist wahrscheinlich ausführlicher als Sie möchten, aber Sie fordern eine etwas komplexe Operation, damit möglicherweise tatsächlicher Code beteiligt ist (der Horror).
Meine Empfehlung, mit
zipObject
der das ziemlich logisch ist:_.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 Hackiness - ich glaube nicht, dass JS die Reihenfolge der Elemente in der Objektiteration garantiert, also reicht
.values()
das Aufrufen nicht aus.quelle
fromPairs
, und das Anrufen reicht in dervalues()
Tat nicht aus. Zumindest vom Standpunkt der Lesbarkeit.Ein anderer Weg mit lodash
Paare erstellen und dann entweder ein Objekt erstellen oder
ES6 Map
einfach_(params).map(v=>[v.name, v.input]).fromPairs().value()
oder
_.fromPairs(params.map(v=>[v.name, v.input]))
Hier ist ein Arbeitsbeispiel
Code-Snippet anzeigen
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>
quelle
Object.fromEntries(params.map(v => [v.name, v.input]))
Es kann auch ohne Verwendung einer Lodash-Funktion wie dieser gelöst werden:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
quelle