2010-04-12 82 views
1

这是一个代码审查问题,而不是任何事情。将相对宽度列表转换为像素宽度

我有以下问题:

鉴于相对宽度的列表(没有刚才的所有相互单元无论如何,),生成像素宽度的列表,以便这些像素宽度具有相同的比例作为原始列表。

输入:比例列表,总像素宽度。

输出:像素宽度的列表,其中每个宽度是一个int,并且它们的总和等于总宽度。

代码:

var sizes = "1,2,3,5,7,10".split(","); //initial proportions 
var totalWidth = 1024; // total pixel width 

var sizesTotal = 0; 
for (var i = 0; i < sizes.length; i++) { 
sizesTotal += parseInt(sizes[i], 10); 
} 

if(sizesTotal != 100){ 
var totalLeft = 100;; 
for (var i = 0; i < sizes.length; i++) { 
    sizes[i] = Math.floor(parseInt(sizes[i], 10)/sizesTotal * 100); 
    totalLeft -= sizes[i]; 
} 
sizes[sizes.lengh - 1] = totalLeft; 
} 

totalLeft = totalWidth; 
for (var i = 0; i < sizes.length; i++) { 
widths[i] = Math.floor(totalWidth/100 * sizes[i]) 
totalLeft -= widths[i]; 
} 
widths[sizes.lenght - 1] = totalLeft; 

//return widths which contains a list of INT pixel sizes 

回答

2

可能值得把它抽象为一个函数......我把它清理了一下。我不确定sizesTotal != 100...是什么东西,所以我生活了。

function pixelWidths(proportions, totalPx) { 

    var pLen = proportions.length, 
     pTotal = 0, 
     ratio, i; 

    for (i = -1; ++i < pLen;) 
     pTotal += proportions[i]; 

    ratio = totalPx/pTotal; 
    pTotal = 0; 

    for (i = -1; ++i < pLen;) 
     pTotal += proportions[i] = ~~(proportions[i] * ratio); 

    proportions[pLen-1] += totalPx - pTotal; 

    return proportions; 

} 

pixelWidths([1,2,3,5,7,10], 1024); // => [36, 73, 109, 182, 256, 368] 

FYI,~~(双按位不)具有获取的任何类型的数字表示(使用内部toInt32操作),然后它地板的作用。例如:

~~'2'; // => 2 
~~'2.333'; // => 2 
~~null; // => 0 
+0

是的,看起来应该可行。我喜欢那个技巧。谢谢! – mkoryak 2010-04-12 17:51:45

1
  • 如果sizes开始了声明号码清单,你为什么要叫parseInt()
  • 在最后一行中拼错“长度”
  • widths其中是宣告的吗?
  • 这是如何解释舍入问题的?原来如此;这是最后一行;那么你不需要添加totalLeft而不只是覆盖那里的任何东西?
+0

你的第一个3分是由于我将这段代码从其他代码中剥离出来并没有花费足够的时间使它看起来单独。我尝试通过不计算每个循环中的最后一次测量来解释舍入问题,但是我给最后一次测量的可用宽度 – mkoryak 2010-04-12 16:04:07