Ahelp
Ahelp

Reputation: 313

typescript - replace map function

I have below const and Model,

export const Motors  = {
 Cars: [
  {'name': 'BMW', 'selected': true},
  {'name': 'Audi', 'selected': true}
 ],
 Trucks: [
  {'name': 'F150', 'selected': true},
  {'name': 'z320', 'selected': true}
 ]
};

Model,

export interface SomeCarRelatedModel {
 abc: string;
 def: string;
}

export interface SomeTruckRelatedModel {
 xyz: string;
 uvw: string;
}

I am doing simple map function to check if abc property exists and contains value, if so set the selected to true else false and so on for other properties as well.

public motors = Motors //exported and assigned to local variable

ngOnint() {
  this.motors.Cars.map(m => {
    if(m.name === 'BMW'){
     m.selected = this.someCarRelateadModel.abc ? 
       this.someCarRelateadModel.abc.length > 0 ? true : false;
    } else if(m.name === 'Audi'){
      m.selected = this.someCarRelateadModel.def ? 
       this.someCarRelateadModel.def.length > 0 ? true : false;
    }
  });

  this.motors.Trucks.map(m => {
   if(m.name === 'F150'){
    m.selected = this.someTruckRelateadModel.xyz ? 
     this.someTruckRelateadModel.xyz.length > 0 ? true : false;
   } else if(m.name === 'z320'){
    m.selected = this.someTruckRelateadModel.uvw ? 
     this.someCarRelateadModel.uvw.length > 0 ? true : false;
   }
  });
}

My code inside ngOnint method involves lot of if statement. Can this modified to better and cleaner code?

Upvotes: 0

Views: 1290

Answers (2)

Naman Kheterpal
Naman Kheterpal

Reputation: 1840

Neat!! :D

ngOnint() {
  this.dealMotors();     
}

private dealMotors(){
    Object.keys(this.motors)
          .forEach(motorType => motorType.forEach(this.dealTraffic));
}

private dealTraffic(m){
  switch(m.name){
    case 'BMW':
       m.selected = this.someCarRelateadModel.abc && this.someCarRelateadModel.abc.length;
      break;
    case 'Audi':
        m.selected = this.someCarRelateadModel.def && this.someCarRelateadModel.def.length;
      break;
    case 'F150':
       m.selected = this.someTruckRelateadModel.xyz && this.someTruckRelateadModel.xyz.length;
     break;
    case 'z320':
        m.selected = this.someTruckRelateadModel.uvw && this.someCarRelateadModel.uvw.length;
  }
}

OR Shorter

motorPropMap = {
    BMW:'abc',
    Audi:'def',
    F150:'xyz',
    z320:'uvw'
}
ngOnint() {
  this.dealMotors();     
}
private dealMotors(){
    Object.keys(this.motors)
          .forEach(motorType => motorType.forEach(
                motor => (motor.selected =
                    this.someCarRelateadModel[this.motorPropMap[motor.name]] &&
                    this.someCarRelateadModel[this.motorPropMap[motor.name]].length)    
            ));
}

Upvotes: 1

bolt
bolt

Reputation: 90

you can do this:

ngOnint() {

  this.dealMotors()
 
}

private dealMotors(){

 this.motors.forEach((item, i , obj)=>{
     item.forEach(element=>{
        this.dealTraffic()
     })
 })
}

private dealTraffic(m){

  switch(m.name){
    case 'BMW':
       m.selected = this.someCarRelateadModel.abc ? 
       this.someCarRelateadModel.abc.length > 0 ? true : false;
      break;
    case 'Audi':
        m.selected = this.someCarRelateadModel.def ? 
       this.someCarRelateadModel.def.length > 0 ? true : false;
      break;
    case 'F150':
       m.selected = this.someTruckRelateadModel.xyz ? 
     this.someTruckRelateadModel.xyz.length > 0 ? true : false;
     break;
    case 'z320':
        m.selected = this.someTruckRelateadModel.uvw ? 
     this.someCarRelateadModel.uvw.length > 0 ? true : false;
  }


}

Upvotes: 1

Related Questions