这是一个代码审查问题。
我遇到以下问题:
给定相对宽度列表(无任何单位,只是相对于彼此),生成像素宽度列表,使这些像素宽度与原始列表具有相同的比例。
输入:比例列表,总像素宽度。
输出:像素宽度列表,其中每个宽度为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
答案 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
而不只是覆盖那里的任何东西吗?