arunmmanoharan
arunmmanoharan

Reputation: 2675

Updating object based on elements in array

I have an object which defines a set of user permissions initially set to false. I have an array which contains multiple elements. Based on each element, I need to update the permissions object.

Below is the sample code.

var environment = 'DEV';

var permissions = {
  superadmin: false,
  admin: false,
  developer: false,
  tester: false,
  general: false,
  grp1: false,
  grp2: false,
  grp3: false,
  grp4: false,
  grp5: false,
  env: environment
};

var user = " azg_environment_DEV_grp4%2Cazg_environment_DEV_Admin%2Cazg_environment_DEV_grp5%2Cazg";

var decodeURIUser = decodeURIComponent(user).split(",");

var permissionsArray = _.filter(decodeURIUser, function(s) {
  return s.indexOf('azg_environment_') !== -1;
});


var permissionsList = _.filter(permissionsArray, function(e) {
  return e.indexOf(environment) !== -1
});

console.log(permissionsList);

if (_.some(permissionsList, function(e) {
    return e.indexOf("SuperAdmin") !== -1
  })) {
  permissions.superadmin = true;
  permissions.admin = true;
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Admin") !== -1
  })) {
  permissions.admin = true;
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Developer") !== -1
  })) {
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Tester") !== -1
  })) {
  permissions.tester = true;
}

if (_.some(permissionsList, function(e) {
    return e.indexOf("grp1") !== -1
  })) {
  permissions.grp1 = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("grp2") !== -1
  })) {
  permissions.grp2 = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("grp3") !== -1
  })) {
  permissions.grp3 = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("grp4") !== -1
  })) {
  permissions.grp4 = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("grp5") !== -1
  })) {
  permissions.grp5 = true;
}

if (_.some(permissionsList, function(e) {
    return e.indexOf("General") !== -1
  })) {
  permissions.general = true;
}

console.log(permissions);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

The function doesnt update grp5 to true. How do I achieve that so my final object would be

var permissions = {
    superadmin: true,
    admin: false,
    developer: true,
    tester: true,
    general: true,
    grp1: false,
    grp2: false,
    grp3: false,
    grp4: true,
    grp5: true,
    env: environment

};

Upvotes: 0

Views: 44

Answers (1)

void
void

Reputation: 36703

It is because you are doing if(){ .. } else if(){ ... } when it comes to grp comparison.

It is getting true for grp4 so it is not checking grp5.

You just need multiple if's

var environment = 'DEV';

var permissions = {
  superadmin: false,
  admin: false,
  developer: false,
  tester: false,
  general: false,
  grp1: false,
  grp2: false,
  grp3: false,
  grp4: false,
  grp5: false,
  env: environment
};

var user = " azg_environment_DEV_grp4%2Cazg_environment_DEV_Admin%2Cazg_environment_DEV_grp5%2Cazg";

var decodeURIUser = decodeURIComponent(user).split(",");

var permissionsArray = _.filter(decodeURIUser, function(s) {
  return s.indexOf('azg_environment_') !== -1;
});


var permissionsList = _.filter(permissionsArray, function(e) {
  return e.indexOf(environment) !== -1
});

console.log(permissionsList);

if (_.some(permissionsList, function(e) {
    return e.indexOf("SuperAdmin") !== -1
  })) {
  permissions.superadmin = true;
  permissions.admin = true;
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Admin") !== -1
  })) {
  permissions.admin = true;
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Developer") !== -1
  })) {
  permissions.developer = true;
  permissions.tester = true;
} else if (_.some(permissionsList, function(e) {
    return e.indexOf("Tester") !== -1
  })) {
  permissions.tester = true;
}

if (_.some(permissionsList, function(e) {
    return e.indexOf("grp1") !== -1
  })) {
  permissions.grp1 = true;
}
if (_.some(permissionsList, function(e) {
    return e.indexOf("grp2") !== -1
  })) {
  permissions.grp2 = true;
}
if (_.some(permissionsList, function(e) {
    return e.indexOf("grp3") !== -1
  })) {
  permissions.grp3 = true;
}
if (_.some(permissionsList, function(e) {
    return e.indexOf("grp4") !== -1
  })) {
  permissions.grp4 = true;
}
if (_.some(permissionsList, function(e) {
    return e.indexOf("grp5") !== -1
  })) {
  permissions.grp5 = true;
}

if (_.some(permissionsList, function(e) {
    return e.indexOf("General") !== -1
  })) {
  permissions.general = true;
}

console.log(permissions);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

FYI There might be easier ways to achieve what you are trying to do here without lots of _.some. Think.

Update (one possible minor code optimization)

function checkPresence(permissionsList, str){
   _.some(permissionsList, function(e) {
      return e.indexOf("grp1") !== -1
   })
}

and now use it in your code everywhere you are doing _.some

if(permissionsList, "General"){
   // ....
}

Upvotes: 2

Related Questions