Home > Net >  javascript: match string to array elements
javascript: match string to array elements

Time:09-09

I have a set of values (groups) in a comma delimited string and would like to check if any of those values match any array items (reqRights) and return true or false, but is returns undefined error.

const reqRights = ["18900253","3217840","1053"]; 
const groups    = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";

function checker(value) {
  var groups = groups.split(",");
  console.log(groups);
  return groups.every(function(v) {
    return value.indexOf(v) !== -1;
  });
}

arr = reqRights.filter(checker);
console.log(arr); 

js engine SpiderMonkey 1.8, does not support .includes and some methods

CodePudding user response:

You're using const on groups, so you cannot reassign it. And you also should move groups.split(",") outside of checker function to avoid creating a new array every time calling checker.

some can help you to check regRights item is in groups instead of every.

const reqRights = ["18900253","3217840","1053"]; 
const groups = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";

const groupsArray = groups.split(",");

function checkGroupValue(group) { 
   return group === value;
}

function checker(value) {
  return groupsArray.some(checkGroupValue);
}

arr = reqRights.filter(checker);
console.log(arr); 

CodePudding user response:

const reqRights = ["18900253","3217840","1053"]; 
const groupsConstant    = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";

function checker(value) {
  var groups = groupsConstant.split(",");
  return groups.every(v => groups.indexOf(v) !== -1);
}

arr = reqRights.filter(checker);
console.log('elements matched: ', arr.length ? 'yes' : 'no'); 

CodePudding user response:

I was trying to avoid the indexOf as it might give a false positive result (example: reqRight "1053" would be listed if found in "1053568") THis is not necessarily the shortest way, but should be compatible with spiderMonkey 1.8

const reqRights = ["18900253","3217840","1053"]; 
const groups    = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";

function checker(values, required) {
  var valuesArray = values.split(",");
  return valuesArray.filter((value) => {
    return required.filter((req) => {
      return req === value; 
    }).length > 0;
  })
}

arr = checker(groups, reqRights);
console.log(arr);

CodePudding user response:

Use Array.find in filtering from groups:

const reqRights = ["18900253","3217840","1053"]; 
const groups    = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";
const checker = value => 
 ({[value]: reqRights.find(v => value === v) ? true : false});
const checked = groups.split(`,`).map(checker);
console.log(checked);

Or maybe concat both (groups as array) arrays, sort that numerically and filter the result on double values.

const reqRights = ["18900253","3217840","1053"]; 
const groups    = "3217635,18272308,1053,3217633,18900253,3217698,3217699,3217840,10162510";
const checked = groups.split(`,`)
  .concat(reqRights)
  .sort( (a, b) =>  a -  b)
  .filter((v, i, self) => self[i 1] === v);
  
console.log(checked);

  • Related