将相对宽度列表转换为像素宽度

时间:2010-04-12 15:24:51

标签: javascript

这是一个代码审查问题。

我遇到以下问题:

给定相对宽度列表(无任何单位,只是相对于彼此),生成像素宽度列表,使这些像素宽度与原始列表具有相同的比例。

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

输出:像素宽度列表,其中每个宽度为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 个答案:

答案 0 :(得分: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]

仅供参考,~~(双位 - 不)具有获取任何类型的数字表示(使用内部toInt32操作)然后对其进行拼接的效果。 E.g:

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

答案 1 :(得分:1)

  • 如果sizes开始宣布为数字列表,为什么必须致电parseInt()
  • 你在最后一行拼错了“长度”
  • widths在哪里宣布?
  • 这如何解决四舍五入问题?原来如此;这是最后一行;那么你不需要添加totalLeft而不只是覆盖那里的任何东西吗?