在Javascript中,给定值,从Object literal中查找名称

时间:2010-12-13 18:43:54

标签: javascript

我是新的JavaScript,并试图找到一种更简单的方法来查找给定来自对象文字的值的名称。

e.g。

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

考虑到'雅阁',我希望从汽车的对象中获得本田。

3 个答案:

答案 0 :(得分:3)

你需要循环,像这样:

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";
}

You can test it out here,对于工作的跨浏览器,这忽略了.indexOf()的存在,因为IE没有它...... that version would look like this

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

答案 1 :(得分:1)

如果您打算这样做一次,那么请使用像Bobby给出的功能。如果您要多次这样做,那么我建议为制造商创建汽车的反向映射:

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]);

注意那些手指发痒的人:对于那些没有继承OP中给出的任何东西的对象,这里检查hasOwnProperty是不必要的。对于继承它的对象取决于程序员。如果你想通过继承实现可组合性,那么hasOwnProperty检查正是你想要的。如果您不关心继承,那么使用hasOwnProperty检查,但如果是这样,您将不会在第一个位置继承,这将使hasOwnProperty检查不必要。在极少数情况下,您被迫通过继承创建对象但不想检查父项的属性,那么您应该执行hasOwnProperty检查。当然,如果您使用像Prototype.js这样坚持修改Object对象的库,那么我为您感到遗憾,因为您被迫执行hasOwnProperty检查。

答案 2 :(得分:0)

保持模型与制造商的单独映射。

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++;
        }
    }
}