2017-03-16 253 views
3

如果我做对象的列表如下:JavaScript函数具有相同属性推构造对象数组

function Car(make, model, year, owner) { 
    this.make = make; 
    this.model = model; 
    this.year = year; 
    this.owner = owner; 
} 

var car1 = new Car('eagle', 'Talon TSi', 1993, 'rand'); 
var car2 = new Car('nissan', '300ZX', 1992, 'ken'); 
var car3 = new Car('nissan', '54353', 2001, 'barbie'); 
var car4 = new Car('nissan', 'XT', 2012, 'sam'); 
var car5 = new Car('eagle', 'GT', 2011, 'owen'); 
var car6 = new Car('eagle', '9', 2014, 'finn'); 

我怎么可以把所有的对象具有相同做出一个数组,我的名字,例如:

var nissan = []; 
var eagle = []; 

甚至可以在make之后命名数组,而不必声明那行代码。

回答

3

使用数组,而不是car1car2car3等,这可以让你呼吁结果Array#filter并获得汽车的列表,只有在一定的化妆:

function Car(make, model, year, owner) { 
 
    this.make = make; 
 
    this.model = model; 
 
    this.year = year; 
 
    this.owner = owner; 
 
} 
 

 
var cars = [ 
 
    new Car('eagle', 'Talon TSi', 1993, 'rand'), 
 
    new Car('nissan', '300ZX', 1992, 'ken'), 
 
    new Car('nissan', '54353', 2001, 'barbie'), 
 
    new Car('nissan', 'XT', 2012, 'sam'), 
 
    new Car('eagle', 'GT', 2011, 'owen'), 
 
    new Car('eagle', '9', 2014, 'finn') 
 
] 
 

 
function isMake (car) { 
 
    return car.make === String(this) 
 
} 
 

 
var nissans = cars.filter(isMake, 'nissan') 
 
var eagles = cars.filter(isMake, 'eagle') 
 

 
console.log(nissans) 
 
console.log(eagles)
.as-console-wrapper { min-height: 100vh; }

编辑:由于bejado指出在his answer,你可能打算为你的车的业主使用报价。我曾假设他们是代表人的物体。

0

有几件事。

首先,我假设所有人都是字符串,因此需要加引号:

var car1 = new Car('eagle', 'Talon TSi', 1993, 'rand'); 

其次,不要让变量,如car4。使用数组。

var cars = [ 
    new Car('eagle', 'Talon TSi', 1993, 'rand'), 
    ... 
]; 

第三,你可以使用filter方法,通过化妆来过滤你的车阵:

function Car(make, model, year, owner) { 
 
    this.make = make; 
 
    this.model = model; 
 
    this.year = year; 
 
    this.owner = owner; 
 
} 
 

 
var cars = [ 
 
    new Car('eagle', 'Talon TSi', 1993, 'rand'), 
 
    new Car('nissan', '300ZX', 1992, 'ken'), 
 
    new Car('nissan', '54353', 2001, 'barbie'), 
 
    new Car('nissan', 'XT', 2012, 'sam'), 
 
    new Car('eagle', 'GT', 2011, 'owen'), 
 
    new Car('eagle', '9', 2014, 'finn') 
 
]; 
 

 
var nissan = cars.filter((car) => car.make == 'nissan'); 
 
console.log(nissan);

你能有点票友,并创建一个返回给汽车的功能作为参数制作:

function carsByMake(make) { 
    return cars.filter((car) => car.make == make); 
} 
var nissan = carsByMake('nissan'); 
var eagle = carsByMake('eagle'); 
0

这里是我的变化:

function Car(make, model, year, owner) { 
 
    this.make = make; 
 
    this.model = model; 
 
    this.year = year; 
 
    this.owner = owner; 
 
} 
 

 
var findByMake = function(list, make) { 
 
    return list.filter(function(item) { 
 
    return (item.make === make); 
 
    }); 
 
}; 
 

 
var car1 = new Car('eagle', 'Talon TSi', 1993, 'rand'); 
 
var car2 = new Car('nissan', '300ZX', 1992, 'ken'); 
 
var car3 = new Car('nissan', '54353', 2001, 'barbie'); 
 
var car4 = new Car('nissan', 'XT', 2012, 'sam'); 
 
var car5 = new Car('eagle', 'GT', 2011, 'owen'); 
 
var car6 = new Car('eagle', '9', 2014, 'finn'); 
 

 
var cars = [].concat(car1, car2, car3, car4, car5, car6); 
 

 
console.log('Make - nissan: ', findByMake(cars, 'nissan')); 
 
var eagle = findByMake(cars, 'eagle'); 
 
console.log('Make - eagle: ', eagle);

0

您可以添加接受另一辆车对象作为参数,如果汽车有给出的成员属性的值相同,则返回true成员方法。

Ex。

function Car(make, model, year, owner) { 
    this.make = make; 
    this.model = model; 
    this.year = year; 
    this.owner = owner; 

    this.isSameMake = function(otherCar){ 
    return this.make === otherCar.make; 
    } 

    this.printCar = function() { // added this method to easily print all the data about car 
     return "Make: " + this.make + "<br>" + 
       "Model: " + this.model + "<br>" + 
       "Year: " + this.year + "<br>" + 
       "Owner: " + this.owner + "<hr>"; 
    } 
} 

此外,我认为这将是更明智的那些车对象添加到数组,因此您可以通过所有的人都轻松地重复和他们的价值观有比较for循环。

var allCars = []; 
allCars.push(new Car('eagle', 'Talon TSi', 1993, rand)); 
allCars.push(new Car('nissan', '300ZX', 1992, ken)); 
allCars.push(new Car('nissan', '54353', 2001, barbie)); 
allCars.push(new Car('nissan', 'XT', 2012, sam)); 
allCars.push(new Car('eagle', 'GT', 2011, owen)); 
allCars.push(new Car('eagle', '9', 2014, finn)); 

然后你可以做的是通过所有的汽车该数组中遍历什么,并创建与该名称的新阵列使,如果它不已经exsists并将其添加到字典中,像这样:

var carsByMake = {}; 

for(var i=0; i<allCars.length; i++){ 
    if(carsByMake[allCars[i].make] == null){ // if there is no array with the current car make in the dictionary 
     var newMake = []; // create a new array 
     newMake.push(allCars[i]); // add current car to it 
     carsByMake[allCars[i].make] = newMake; // add the array to the dictionary with the key of the current car make 
     } 
     else{ 
      carsByMake[allCars[i].make].push(allCars[i]); // else just add to dictionary with the key of current car make 
     } 
    } 

之后,您可以遍历字典,并通过它的关键字获取存储在其中的所有对象,例如carsByMake [“nissan”]将存储包含make nissan等所有汽车的数组。 您按以下方式迭代字典:

for(var key in carsByMake){ // iterate through dictionary 
    for(var i=0; i<carsByMake[key].length; i++){ // get all the elements in the current list in dictionary 
     document.write("carsByMake[" + key + "][" + i + "] = " + carsByMake[key][i].printCar() + "<br>"); 
    } 
} 

这将打印出:

carsByMake[eagle][0] = (Make: eagle, Model: Talon TSi, Year: 1993, Owner: rand) 

carsByMake[eagle][1] = (Make: eagle, Model: GT, Year: 2011, Owner: owen) 

carsByMake[eagle][2] = (Make: eagle, Model: 9, Year: 2014, Owner: finn) 

carsByMake[nissan][0] = (Make: nissan, Model: 300ZX, Year: 1992, Owner: ken) 

carsByMake[nissan][1] = (Make: nissan, Model: 54353, Year: 2001, Owner: barbie) 

carsByMake[nissan][2] = (Make: nissan, Model: XT, Year: 2012, Owner: sam) 

正如你所看到的鹰之作所有的汽车通过的“鹰”的密钥存储在字典中,和日产的所有汽车制造是通过“日产”键存储在字典中。

+0

我试图避免重复的代码 –

相关问题