让我们假设我们有这个字符串 var coords="10,10 20,20 30,30 20,10 60,80"
让我们进一步假设以上每个是XY坐标。现在,我想"将每个项目缩放为sx
和sy
的一个因素,然后返回一个形成的字符串。
例如scaleCoords(coords,0.5,2)
应返回"5,20 10,40 15,60 10,20 30,160"
在JS中最优雅的方法是什么?(优雅,我的意思是最短,不一定最快)?
我的想法是在" "
上将其拆分,获取一个数组,然后对于每个数组元素,将其拆分为",",对每个数组进行 parseInt()
,乘以sx
和sy
,然后将转换值添加到另一个字符串中。返回该字符串。我确定有更好的方法
您可以用空间和逗号分开,然后将因子应用于每个数字并稍后加入。
function scaleCoords(string, left, right) {
var f = [left, right];
return string.split(' ').map(function (a) {
return a.split(',').map(function (b, i) {
return b * f[i];
});
}).join(' ');
}
var coords = "10,10 20,20 30,30 20,10 60,80";
console.log(scaleCoords(coords, 0.5, 2)); // '5,20 10,40 15,60 10,20 30,160'
es6带有REST参数...
function scaleCoords(s, ...f) {
return s.split(' ').map(a => a.split(',').map((b, i) => b * f[i])).join(' ');
}
var coords = "10,10 20,20 30,30 20,10 60,80";
console.log(scaleCoords(coords, 0.5, 2)); // '5,20 10,40 15,60 10,20 30,160'
或轻微的修改,以避免拨打map
和join
的额外开销
var data = "10,10 20,20 30,30 20,10 60,80";
function scaleNumString(s,xs,ys){
return s.split(" ").map(c=>((x,y)=>x*xs+","+y*ys)(...c.split(","))).join(" ");
}
scaleNumString(data,0.5,0.5)
或
return s.split(" ").map(c=>(a=>a[0]*xs+","+a[1]*ys)(c.split(","))).join(" ");
或
return s.replace(/[0-9]+,[0-9]+/g,a=>(a=>a[0]*xs+","+a[1]*ys)(a.split(",")));