0

私はjavascriptを学んでおり、メソッド、コンストラクター、およびthisキーワードを試してみることにしました。プロパティ値内の単語と一致する特定の単語に基づいて車を見つける方法を作成しました。単語が値に一致することが判明した場合は、そのオブジェクトを返します。問題は、複数のオブジェクトが同じプロパティ値を持つ場合、それらの最初のものだけが返されることです。同じ値を持つすべてのオブジェクトを返すにはどうすればよいですか? 簡単に解決できますか、それとも解決策は本当に進んでいますか? キーワードを使用してさまざまなバリエーションを試しましたthisが、何も機能しませんでした。

//The constructor
function car(make, model, year, condition){
    this.make = make;
    this.model = model;
    this.year = year;
    this.condition = condition;
}

//An object that holds properties that are really just more objects
var cars = {
car1: new car("Toyota", "Corolla", 2013, "New"),
car2: new car("Hyundai", "Sonata", 2012, "Used"),
car3: new car("Honda", "Civic", 2011, "Used") 
};

//The method
findCar = function(find){
for(var i in cars){
    if(cars[i].make.toLowerCase() === find){
        return cars[i];
    }
    else if(cars[i].model.toLowerCase() === find){
        return cars[i];
    }
    else if(cars[i].year === parseInt(find,10)){
        return cars[i];
    }
    else if(cars[i].condition.toLowerCase() === find){
        return cars[i];
    } 
}
};


cars.findCar = findCar;

//This is where I search for cars
cars.findCar(prompt("Enter a car make, model, year or condition").toLowerCase());
4

2 に答える 2

1

次のような配列に車を格納できます。

findCar = function(find){
 var finds = [];
 for(var i in cars){
    if(cars[i].make.toLowerCase() === find){
        finds.push(cars[i]);
    }   
    else if(cars[i].model.toLowerCase() === find){
        finds.push(cars[i]);
    }
    else if(cars[i].year === parseInt(find,10)){
        finds.push(cars[i]);
    }
    else if(cars[i].condition.toLowerCase() === find){
        finds.push(cars[i]);
    }        
 }
 return finds;
};

繰り返しを避けるには:

findCar = function(find){
    var finds = [];
    for(var i in cars){

        //Loop through properties
        for(var j in cars[i]){

            if(cars[i][j] === find){
                finds.push(cars[i]);
                //If found, pass to the next car
                break;
            }
        }
     }
     //Return results.
     return finds;
};

次のステップは、検索に正規表現を追加することです。

于 2014-05-31T23:13:19.407 に答える
0

return キーワードは 1 つのオブジェクトのみを返し、そのオブジェクトは配列にすることができます。さらに、リターンが実行された後は関数内でコードが実行されないため、何かを返す前にループのすべての反復が完了するまで待つ必要があります。ロジックをリファクタリングせずに(他にもいくつかの問題があります)、質問にのみ答えると、これは上記の例の変更されたコードです。

//The method
findCar = function(find){
    var results = [];

    for(var i in cars){
        if(cars[i].make.toLowerCase() === find){
            results.push(cars[i]);
        }   
        else if(cars[i].model.toLowerCase() === find){
            results.push(cars[i]);
        }
        else if(cars[i].year === parseInt(find,10)){
            results.push(cars[i]);
        }
        else if(cars[i].condition.toLowerCase() === find){
            results.push(cars[i]);
        }        
    }

    return results;
};
于 2014-05-31T23:18:22.780 に答える