我是新的JavaScript,并试图找到一种更简单的方法来查找给定来自对象文字的值的名称。
e.g。
var cars ={ Toyata: ['Camry','Prius','Highlander'],
Honda: ['Accord', 'Civic', 'Pilot'],
Nissan: ['Altima', 'Sentra', 'Quest']};
考虑到'雅阁',我希望从汽车的对象中获得本田。
答案 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++;
}
}
}