3 Stimmen

In Javascript, given value, find name from Object literal

Ich bin neu JavaScript und versuchen, herauszufinden, eine einfachere Art und Weise zu finden, Name gegeben einen Wert von Objekt literal.

z.B..

var cars ={ Toyata: ['Camry','Prius','Highlander'],
            Honda:  ['Accord', 'Civic', 'Pilot'],
            Nissan: ['Altima', 'Sentra', 'Quest']};

Mit 'Accord' möchte ich Honda aus dem Objekt Cars holen.

4voto

Nick Craver Punkte 609016

Sie müssten eine Schleife durchlaufen, etwa so:

function getManufacturer(carName) {
    for(var key in cars) {
        if(cars.hasOwnProperty(key)) {
           for(var i=0; i<cars[key].length; i++) {
              if(cars[key][i] == carName) return key;
           }
        }
    }
    return "Not found";
}

Sie können es hier ausprobieren zu verwenden, damit dies auch browserübergreifend funktioniert, ignoriert dies die Existenz von .indexOf() da der IE es nicht hat... würde diese Version wie folgt aussehen :

function getManufacturer(carName) {
    for(var key in cars) {
        if(cars.hasOwnProperty(key) && cars[key].indexOf(carName) != -1) {
            return key;
        }
    }
    return "Not found";
}

2voto

slebetman Punkte 100693

Wenn Sie das nur einmal machen wollen, dann verwenden Sie eine Funktion wie die von Bobby beschriebene. Wenn Sie dies mehrmals tun wollen, würde ich vorschlagen, eine umgekehrte Zuordnung von Autos zu Herstellern zu erstellen:

var manufacturers = {};

// create a map of car models to manufacturers:
for (var manf in cars) {
    /* see note below */

    for (var i=0; i<cars[manf].length; i++) {
        manufacturers[cars[manf][i]] = manf;
    }
}

// Now referencing the manufacturers is 
// a very fast hash table lookup away:

var model = 'Accord';
alert(manufacturers[model]);

Hinweis für diejenigen mit juckenden Fingern beim Heruntervoten: Für Objekte, die nichts erben, wie im OP angegeben, ist eine hasOwnProperty-Prüfung hier unnötig. Bei Objekten, die erben, hängt es vom Programmierer ab. Wenn Sie Kompatibilität über Vererbung wollen, dann ist eine hasOwnProperty-Prüfung genau das, was Sie NICHT wollen. Wenn Sie sich nicht um die Vererbung kümmern, dann verwenden Sie eine hasOwnProperty-Prüfung, aber dann würden Sie gar nicht erst vererben, was eine hasOwnProperty-Prüfung unnötig machen würde. In dem seltenen Fall, dass Sie gezwungen sind, das Objekt durch Vererbung zu erstellen, aber die Attribute des Elternteils nicht überprüfen wollen, sollten Sie eine hasOwnProperty-Prüfung durchführen. Wenn Sie natürlich eine Bibliothek wie Prototype.js verwenden, die darauf besteht, das Object-Objekt zu modifizieren, dann tut es mir leid für Sie, weil Sie gezwungen sind, eine hasOwnProperty-Prüfung durchzuführen.

0voto

Sean Vieira Punkte 147654

Pflegen Sie eine separate Zuordnung von Modellen zu Herstellern.

var cars ={ Toyata: ['Camry','Prius','Highlander'],
            Honda:  ['Accord', 'Civic', 'Pilot'],
            Nissan: ['Altima', 'Sentra', 'Quest']};

var models = {};
var hasOwnProperty = Object.prototype.hasOwnProperty;
for (key in cars) {
    if (hasOwnProperty.call(cars, key)) {
        var i=0,l=cars[key].length,manufacturer=cars[key];
        while (i<l) {
            if ( ! hasOwnProperty.call(models, manufacturer)) {
                models[manufacturer] = key;
            } else {
                // Throw an error, or change the value to an array of values
            }
            i++;
        }
    }
}

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