555 Stimmen

Konvertiere das Objekt-Array in eine Hashtabelle, indexiert nach einem Attributwert des Objekts

Anwendungsfall

Der Anwendungsfall besteht darin, ein Array von Objekten in eine Hash-Map umzuwandeln, basierend auf einem String oder einer Funktion, die zur Auswertung und Verwendung als Schlüssel in der Hash-Map und als Wert als Objekt selbst dient. Ein häufiger Anwendungsfall für dies ist die Umwandlung eines Arrays von Objekten in eine Hash-Map von Objekten.

Code

Im Folgenden finden Sie einen kleinen Ausschnitt in JavaScript, um ein Array von Objekten in eine Hash-Map umzuwandeln, indexiert nach dem Attributwert des Objekts. Sie können eine Funktion angeben, um den Schlüssel der Hash-Map dynamisch (zur Laufzeit) zu bewerten.

function isFunction(func) {
    return Object.prototype.toString.call(func) === '[object Function]';
}

/**
 * Diese Funktion wandelt ein Array in eine Hash-Map um
 * @param {String | function} key beschreibt den Schlüssel, der in jedem Objekt ausgewertet werden soll, um ihn als Schlüssel für die Hash-Map zu verwenden
 * @returns Object
 * @Example 
 *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
 *      Returns :- Object {123: Object, 345: Object}
 *
 *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
 *      Returns :- Object {124: Object, 346: Object}
 */
Array.prototype.toHashMap = function(key) {
    var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
    this.forEach(function (obj){
        _hashMap[getKey(obj)] = obj;
    });
    return _hashMap;
};

Sie finden das Gist hier: Konvertiert Array von Objekten in HashMap.

7voto

Tiago Bértolo Punkte 3457

Wenn Sie auf die neue ES6 Map umstellen möchten, tun Sie dies:

var kvArray = [['key1', 'value1'], ['key2', 'value2']];
var myMap = new Map(kvArray);

Warum sollten Sie diese Art von Map verwenden? Nun, das liegt ganz bei Ihnen. Schauen Sie sich diese an.

5voto

Peter Punkte 7672

Dies ist, was ich in TypeScript mache. Ich habe eine kleine Hilfsbibliothek, in der ich solche Dinge ablegen.

export const arrayToHash = (array: any[], id: string = 'id') => 
         array.reduce((obj, item) =>  (obj[item[id]] = item , obj), {})

Verwendung:

const hash = arrayToHash([{id:1,data:'data'},{id:2,data:'data'}])

oder wenn Sie einen anderen Bezeichner als 'id' haben

const hash = arrayToHash([{key:1,data:'data'},{key:2,data:'data'}], 'key')

4voto

Tho Punkte 19990

Mit lodash:

const items = [
    { key: 'foo', value: 'bar' },
    { key: 'hello', value: 'world' }
];

const map = _.fromPairs(items.map(item => [item.key, item.val]));

// ODER: wenn Sie das gesamte Element nach Schlüssel indizieren möchten:
// const map = _.fromPairs(items.map(item => [item.key, item]));

Die fromPairs Funktion in lodash erinnert mich an die zip Funktion in Python

Link zu lodash

3voto

Mor Shemesh Punkte 2408

Eine kleine Verbesserung bei der Verwendung von reduce:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = arr.reduce((map, obj) => ({
    ...map,
    [obj.key] = obj.val
}), {});

console.log(result);
// { foo: 'bar', hello: 'world' }

3voto

RyanShao Punkte 381

Die reduzierte Version scheint nicht zu funktionieren. Ich gehe wie folgt vor.

   let map = {};
    items.forEach(v=>{
      map [v.xxx] = v;
    });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X