在Javascript中,给定值,从对象文本中查找名称

在Javascript中,给定值,从对象文本中查找名称,javascript,Javascript,我是新的JavaScript,试图找到一种更简单的方法,从object literal中找到给定值的名称 e、 g 给定“雅阁”,我想从目标车中获得本田。您需要循环通过,如下所示: function getManufacturer(carName) { for(var key in cars) { if(cars.hasOwnProperty(key)) { for(var i=0; i<cars[key].length; i++) {

我是新的JavaScript,试图找到一种更简单的方法,从object literal中找到给定值的名称

e、 g


给定“雅阁”,我想从目标车中获得本田。

您需要循环通过,如下所示:

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

如果你打算这样做一次,那么就使用一个类似于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]);
var制造商={};
//为制造商创建车型地图:
用于(车辆中的var manf){
/*见下文注释*/

对于(var i=0;i保持模型到制造商的单独映射

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++;
        }
    }
}
var cars={Toyata:['Camry','Prius','Highlander',],
本田:[“雅阁”、“思域”、“飞行员”],
日产:['Altima','Sentra','Quest']};
var模型={};
var hasOwnProperty=Object.prototype.hasOwnProperty;
用于(车内钥匙){
if(hasOwnProperty.call(cars,key)){
变量i=0,l=cars[key]。长度,制造商=cars[key];

如果另一个制造商有相同的车型,我会怎么办?比如说雪佛兰做出了一个协议。“一个更简单的方法”比什么好?你为什么不公布你现在是怎么做的?顺便说一句,可能没有更简单的方法,除非你可以使用一个可能有帮助的库。这不会有相同的结果,应该注意的是,如果两个制造商生产同一辆车,这将返回最后一个,而不是第一个,两个位置都是相对于对象的ty顺序…这不是保证。@Nick:啊,但是如果我们在这里谈论汽车,那么模型名称很可能是唯一的。类似地,其他问题域也可能有这个属性。此外,对象属性有随机顺序(至少在理论上),所以说“第一”或“最后”如果不首先对制造商名称进行排序,则没有任何意义。(在firefox上进行了测试,在执行for..in循环时,对象属性不一定按照创建顺序出现,这不是PHP)只是好奇…这些车是多余的吗?@SB-不是,如果有人弄乱了对象原型…最好是安全的IMO@SB当前位置这主要是货运邪教节目。理论是这样做是安全的,但不这样做不一定安全。请参阅我答案的脚注,了解可能不安全的原因it.提示:hasOwnProperty将告诉您该属性是否被继承。@slebetman-您不必从任何异常继承,无论您从
对象继承什么,并且它可以向其原型中添加其他属性。如果有人添加了一个函数、字符串或…?没有它怎么办你假设存在一个数组,这不是一个安全的假设。@尼克:我在脚注中提到了这一点:你必须做一个hasOwnProperty检查,我为你感到抱歉。我的假设是它是一个原始javascript对象,没有继承任何东西。如果它是一个数组,那么它就不是一个原始javascript对象,而是继承一个数组因此您必须进行hasOwnProperty检查(在我的回答中再次提到)。更多代码:耶!希望有一个数据结构支持双向(bidi)键到值的映射,反之亦然versa@George--请原谅我不理解……你为什么建议使用数据结构方法?我不认为在这种情况下这样做会更好。(我猜这是为了可重用性)。是的,用于可重用性。可能是一个封装原始数据结构和您建议的数据结构的自定义对象。但肯定是将两者关联起来的某种方式,因此它们不在全局范围内,彼此没有关系。
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]);
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++;
        }
    }
}