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

Jquery selecting text between parentheses in an array

本文关键字:之间 文本 选择 数组 Jquery      更新时间:2023-09-26

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

期限 03 (-1000(,1 (+1000(,

价格 (+3000(,1 (+1500(,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--

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

值 (+1000(、

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

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

/'(([+-])('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));

PS:如果你已经有一个数组,你可以删除.split(',')部分。

如果您不太

擅长正则表达式,我制作了一个不"使用"它们的版本,这样它更具可读性,更容易看到正在发生的事情以及它是如何做到的。并不是说你不应该使用正则表达式。

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

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
    }
}

这里的例子

也许是这样的:

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

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

我设法让它与下面相当繁琐的代码一起工作。它确实适用于正整数和负整数。

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

演示

尝试

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>