Javascript Jquery选择数组中括号之间的文本
我有一个基于多个选择框中选定值的数组: 期限03(-1000),1(+1000),价格(+3000),1(+1500)-- 逗号分隔。正如您所看到的,有些值在括号中有文本。我需要将这些值放在括号中并求和,因此Javascript Jquery选择数组中括号之间的文本,javascript,jquery,regex,Javascript,Jquery,Regex,我有一个基于多个选择框中选定值的数组: 期限03(-1000),1(+1000),价格(+3000),1(+1500)-- 逗号分隔。正如您所看到的,有些值在括号中有文本。我需要将这些值放在括号中并求和,因此+和-字符应该保留 值(+1000),(+3000),(-1000)表示价格变化:+表示产品会更贵,-表示产品会更便宜。这样做的结果应该是一个数字,表明价格的变化-例如1500-产品的成本将高于基本价格,或例如3000-产品将更便宜。 提前谢谢。 Tom您有逗号分隔的值,其中包含要提取的数字
+
和-
字符应该保留
值(+1000),(+3000),(-1000)表示价格变化:+表示产品会更贵,-表示产品会更便宜。这样做的结果应该是一个数字,表明价格的变化-例如1500-产品的成本将高于基本价格,或例如3000-产品将更便宜。
提前谢谢。
Tom您有逗号分隔的值,其中包含要提取的数字。首先将输入拆分为一个数组,然后使用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(',')
部分。可能是这样的:
var sum = 0;
csv.replace(/\([^)]+\)/gi, function (str) { sum += parseInt(str,10); return str; }
没有测试代码。无论如何,我的想法是使用正则表达式循环所有括号,然后在replace函数中,将匹配的字符串转换为整数,并将其添加到sum中。我成功地使用了下面相当繁琐的代码。它对正整数和负整数都有效
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=“期限03(-1000)、1(+1000)、价格(+3000)、1(+1500)、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-、-”拆分(“,”)
,总和=0;
arr.map(函数(v,k){
//将'v'值转换为'Number',例如,'[-1000、1000、3000、1500]`
var n=数字(v.replace(/\w+[^\(+\d+\)].[\(\\)]/g,”)|空;
//在'sum'处添加'n'数字,例如,'-1000+1000+3000+1500`='4500`
总和+=n
});
document.write(sum)/`4500`
我们没有收到您的..“括号”或括号?如果可能,可以发布实际数组文字吗?求和要求是否为-1++1
等?1000
与1000
在数字上相同?定义sum
在此上下文中的含义。提供真实的数组样本和预期的输出在将值粘合到字符串中之前,使用这些值可能更容易做到这一点
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`