从字符串中获取元素数组并查找值

时间:2017-03-19 10:10:26

标签: javascript arrays lookup indexof

我有一个来自数据库的计算字符串,如:

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

我希望用" {}"拉出所有元素。这样我就可以从数据库中查找它们的值。什么是最快这样做的方式,所以我最终找到了一个可以查找的有序数组,并将字符串中的值替换回来。

我考虑过:

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

3 个答案:

答案 0 :(得分:1)

使用正则表达式

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

Demo

答案 1 :(得分:1)

不确定它是否是“最快”的方式,但你应该考虑使用正则表达式。

类似的东西:

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

您的正则表达式可能需要根据{}表达式的实际定义进行细化(基于允许的字符,引用等)。

收到值后,您可以使用replace替换值。

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

注意:如果您打算将此信息发送给eval等,请非常小心。

答案 2 :(得分:0)

Regex首先浮现在脑海中,但在O(n)时间内实现这项工作的另一种方式可能是;



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);




出于好奇,我已经对JSBen进行了一些测试,似乎@ jcaron的正则表达确实非常有效。您可以使用indexOffor循环等其他任何想法扩展这些测试。