Jquery在数组中的括号之间选择文本

时间:2014-11-04 14:52:43

标签: javascript jquery regex

我有一个基于多个选择框中选定值的数组:

  

第03项(-1000),1(+1000),价格(+3000),1(+1500), - , - , - , - , - , - , - , - - , - , - , - , - , - , - , - , - , - , -

逗号分隔。如您所见,某些值在括号中有文本。我需要在括号中取这些值并求它们,因此+-字符应该保留。

值(+ 1000),(+ 3000),( - 1000)代表价格的变化:+表示产品会更贵, - 表示产品会更便宜。结果应该是一个表示价格变化的数字 - 例如1500 - 产品的成本将超过基本价格,或者例如-3000 - 产品会更便宜。 提前致谢。 汤姆

5 个答案:

答案 0 :(得分:1)

您有逗号分隔的值,其中包含要提取的数字。首先将输入拆分为数组,然后对每个项目使用regexp提取值,例如:

/\(([+-])(\d+)\)/ //will search for a sign (+/-) and a number between parenthesis

应用于项目将导致数组具有第二个位置的符号和第三个位置的数字

/\(([+-])(\d+)\)/.exec('Term 03 (-1000)') //--> ['Term 03 (-1000)', '-', '1000']

使用reduce来对所有符号进行求和:

var changes = str.split(',').reduce(function(sum, item){
  var matches = /\(([+-])(\d+)\)/.exec(item);
  if(matches) {
   return sum + (matches[1] === '-' ? -1 : 1) * parseInt(matches[2]);
  } else {
    return sum;
  }
}, 0));

P.S。:如果您已有数组,则可以删除.split(',')部分。

答案 1 :(得分:0)

也许是这样的:

var sum = 0; 
csv.replace(/\([^)]+\)/gi, function (str) { sum += parseInt(str,10); return str; }

没有测试代码。无论如何想法是使用正则表达式循环所有括号,然后在里面替换函数,将匹配的字符串转换为整数并将其添加到总和。

答案 2 :(得分:0)

我设法使用下面相当繁琐的代码。它确实适用于正整数和负整数。

var result = arr.map(function (el) {
  if (el.indexOf('(') > -1 && el.indexOf(')') > -1) {
    return Number(el.match(/\(([\+\- 0-9]*)\)/g)[0].replace(/[\(\) ]/g , ''));
  }
}).filter(function (el) {
  if (typeof el !== undefined) {
    return el;
  }
}).reduce(function (p, c) {
  return p + c;
});

DEMO

答案 3 :(得分:0)

如果你不熟悉正则表达式我已经制作了一个不“使用”它们的版本,这样它就更容易理解正在发生的事情以及它是如何进行的。不是说你不应该使用正则表达式。

对于这个算法,我们基本上查看每个项目,检查它们是否有有效的括号,然后如果我们有+我们在括号内添加值,否则如果我们有-我们减去(假设这是你可以拥有的那两个):

for(items in array) {
    var firstPar = array[items].indexOf("(");
    var secondPar = array[items].indexOf(")");
    // Check of the item has parentheses and are like this (...)
    if( (firstPar > 0 && secondPar > 0) && (secondPar > firstPar) ) {
        // Get the number from the string
        var value = array[items].substring(firstPar+2, secondPar);
        value = parseInt(value); // To Number
        if( array[items].charAt(firstPar+1) == '+')
            ProductPrice += value; // If "+" add
        else  
            ProductPrice -= value;// If "-" subtract
    }
}

<强> Example Here

答案 4 :(得分:0)

尝试

var arr = "Term 03 (-1000),1 (+1000),Price (+3000),1 (+1500),--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--".split(",")
, sum = 0;
arr.map(function(v, k) {
  // cast `v` value as `Number` , e.g., `[-1000, 1000, 3000, 1500]`
  var n = Number(v.replace(/\w+[^\(+\d+\)]|[\(|\)]/g, "")) || null;
  // add `n` Number's at `sum` , e.g., `-1000 + 1000 + 3000 + 1500` = `4500`
  sum += n
});
// console.log(sum); // `4500`

var arr = "Term 03 (-1000),1 (+1000),Price (+3000),1 (+1500),--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--".split(",")
, sum = 0;
arr.map(function(v, k) {
  // cast `v` value as `Number` , e.g., `[-1000, 1000, 3000, 1500]`
  var n = Number(v.replace(/\w+[^\(+\d+\)]|[\(|\)]/g, "")) || null;
  // add `n` Number's at `sum` , e.g., `-1000 + 1000 + 3000 + 1500` = `4500`
  sum += n
});
    
    document.write(sum) // `4500`
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>