最优雅的方式来解析,缩放和重新串联一串数字坐标

时间:2016-12-31 21:42:08

标签: javascript

我们假设我们有这个字符串 var coords="10,10 20,20 30,30 20,10 60,80"

让我们进一步假设上述每一个都是XY坐标。现在,我想“按比例缩放每个项目,比如sxsy,然后返回一个已形成的字符串。

例如scaleCoords(coords,0.5,2)应该返回"5,20 10,40 15,60 10,20 30,160"

在JS中最优雅的方式是什么?(优雅我的意思是最短,不一定最快)?

我的想法是将它拆分为" ",得到一个数组,然后对于每个数组元素,将其拆分为“,”,在每个数组上执行parseInt(),乘以{{1} }和sx并将转换后的值添加到另一个字符串。返回那个字符串。我确信有更好的方法

2 个答案:

答案 0 :(得分:5)

您可以使用空格和逗号分割并将因子应用于每个数字,然后再加入。



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 parameters ...



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'




答案 1 :(得分:0)

或稍作修改,以避免为坐标对调用mapjoin的额外开销

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(",")));