简体   繁体   中英

is there more elegant way to write this condition?

I want a smaller way to write this condition I've tried to simplify it but it doesn't work with me

if(( data.includes(userId) || data.includes(userId.toString())  || data.includes(username) )) console.log(true)

this condition works very good but I want a simplified version of it

You can use the some Array method to test for multiple predicates. Either

if ([userId, userId.toString(), username].some(x => data.includes(x))) …

or

if (data.some(x => [userId, userId.toString(), username].includes(x))) …

If you define data as object instead of array, the condition can be simplified to:

if (data[userId] || data[username]) console.log(true)

Also, the check will be O(1) instead of O(n) . Example:

 var data = {1:1, '2':1} if (data[1]) console.log(1) if (data[2]) console.log(2) if (data['2']) console.log("'2'") if (data[3] || data[2]) console.log('3 or 2') 

or Set :

 var data = new Set([1, '2']) if (data.has(1)) console.log(1) if (data.has(2)) console.log(2) // false if (data.has('2')) console.log("'2'") if (data.has(3) || data.has(2) || data.has('2')) console.log('3 or 2') 

Make flags using bitsets, such as this;

haveUserid = 1,
haveUsername = 2,
haveSchoolId = 4,
haveBadge = 8,
haveBlabla = 16,

Set the flag(let's say you want to set as haveUserid, haveUsername and haveBlabla)

data.flag = haveUserid + haveUsername + haveBlabla; // equals 1+2+8 = 11

and then you test the bits. I don't know if javascript has somekind of a function but you can also write a function of your own. That way you wouldn't have to write N amount of data.includes inside an if statement and just test the bits to see if data.flag satisfies your conditions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM