主要问题是我如何更新字符串中的所有数字?
我想用字符串更新数字的示例:
-ms-transform: rotate(7deg);
margin: 10px 20px 30px 40px;
Value10isMoreThan5
所以数字的每个“块”都应该单独处理(例如10
或1 0
或1px2
,无论数字段之间是空格还是字符。
当我使用空格来分割字符串时,我得到了这个功能,但是当字符串没有空格rotate(7deg)
时,它不起作用。这是一小段“意大利面条代码”的例子。
// Basic lerp
function lerp (min, max, amount) {
return min + amount * (max - min);
}
// Lerp values in string
function lerpAllNumbers (a, b, amount) {
var aNumbers = separateNumbers(a);
var bNumbers = separateNumbers(b);
var returnValue = null;
if (aNumbers.length === bNumbers.length) {
for (var i = 0; i < aNumbers.length; i++) {
var searchString = aNumbers[i].value + aNumbers[i].extension;
var newValue = lerp(aNumbers[i].value, bNumbers[i].value, amount).toFixed(3) + aNumbers[i].extension;
returnValue = a.toString().replace(searchString, newValue);
}
return returnValue;
}
}
// Separate numbers from string and create object with value and extension
function separateNumbers(text) {
var splitter = text.toString().split(" ");
var returnArray = [];
splitter.forEach(function(item){
var numberObj = {
value: parseFloat(item),
extension: item.replace(/^-?\d+((.|,)\d+)?/g, '')
}
returnArray.push(numberObj);
});
return returnArray;
}
很抱歉,如果有重复项。我发现这个帖子已经很有用了:regex to split number from string
但是对于这种情况,我不需要更新多个数字并在更新后将它们放回正确的位置。
使用JavaScript(Vanilla或jQuery)更新字符串中的所有数字是否更智能/更简单?
答案 0 :(得分:1)
您需要使用带有匿名回调方法的String#replace
:
// Basic lerp
function lerp (min, max, amount) {
return Number(min + amount * (max - min));
}
var s = "-ms-transform: rotate(7deg);";
var max = 15, amount = 2;
console.log(
s.replace(/-?\d*[,.]?\d+/g, function(m) {
return lerp(Number(m), max, amount).toFixed(3);
})
);
&#13;
模式为/-?\d*[,.]?\d+/g
,可匹配多次出现的可选减号,0 +位数后跟,
或.
,然后是1位数。
function(m){}
是传递给String#replace
方法的匿名回调方法,作为替换参数,其值可以传递给其他方法。
答案 1 :(得分:1)
这个答案基于@WiktorStribiżew回答,它使用其他字符串值替换字符串中的所有值,并从那些值计算lerp值。
// Basic lerp function
function lerp (min, max, amount) {
return min + amount * (max - min);
}
function lerpAllNumbers (a, b, amount) {
a = 'rotate(-35.4deg 45.3deg)';
b = 'rotate(100deg 200deg)';
bArr = b.match(/-?\d*[,.]?\d+/g);
console.log(
a.replace(/-?\d*[,.]?\d+/g, function(m) {
return utils.lerp(Number(m), bArr.shift(), amount).toFixed(3)
})
); // rotate(99.946deg 199.938deg)
}