Wayneio
Wayneio

Reputation: 3576

Get array of elements from a string and look up values

I have a calculation string from a database like:

var calc = "{a}+{b}==2"

and I want to pull all the elements with "{}" so that I can look up their values from a database. What's the fastest way of doing this, so I end up with an ordered array that I can look up, and replace the values back in the string.

I've considered:

 - For loop, looking for { then finding the next }
 - Split with a map
 - IndexOf

Upvotes: 1

Views: 64

Answers (3)

Redu
Redu

Reputation: 26191

Regex comes to the mind first but one other way of implementing this job in O(n) time could be;

function getDatas(s){
  var dataOn = false;
  return Array.prototype.reduce.call(s,(d,c) => dataOn ? c !== "}" ? (d[d.length-1] += c,d)
                                                                   : (dataOn = false, d)
                                                       : c === "{" ? (dataOn = true, d.push(""),d)
                                                                   : d, []);
  
}

var calc = "{a}+{b}+{colorSpace}==2",
  result = getDatas(calc);
console.log(result);

So out of curiosity i have done some tests on JSBen and it seems that @jcaron's regex is indeed much efficient. You may extend those tests with any of your other ideas like indexOf or for loop.

Upvotes: 0

jcaron
jcaron

Reputation: 17720

Not sure if it's the "fastest" way, but you should consider using a regex.

Something like:

var calc = "{a}+{b}==2";
var re = /{([^}]+)}/g;
var res;
var result = [];
while (res = re.exec(calc))
{
    result.push(res[1]);
}
console.log(result);

Your regex may need to be refined based on the actual definition of the {} expressions (based on allowed characters, quoting, etc.).

Once you have received the values back, you can then use replace to replace the values.

var values = {a: 1, b: 3};
var replaced = calc.replace(re,function(match,name) { return values[name]; });
console.log(replaced);

NB: be very careful if you plan to then send this to eval or the like.

Upvotes: 1

Suresh Atta
Suresh Atta

Reputation: 122006

Using regex

 var exp = /{([^}]+)}/g ,index;
  while(index = exp.exec("{a}+{b}==2")) {
    console.log(index[1]);
  }

. Demo

Upvotes: 1

Related Questions