鉴于我在Javascript中有一个数组,其值为;
0 => 0x0000FF
1200 => 0x00CCFF
28800 => 0xFF0AFF
36000 => 0xFFFFFF
如何确定给定索引值介于哪些元素之间?在前面的示例中,如果我的值为31073,则需要检索28800 => 0xFF0AFF
和36000 => 0xFFFFFF
答案 0 :(得分:2)
使用Javascript的稀疏数组没有“内置”方法来实现这一点。在保持一定效率的同时对任意稀疏索引执行此操作的最简单方法是将另一个可视化排序的索引数组保存到主数组中。然后,您可以遍历旁视列表以查找正确的邻居索引,然后返回主数组以获取其值。
如果您的数组很大或访问需要比O(项目)更快,您可以查看旁视对象的各种树结构。
答案 1 :(得分:2)
这是一种简单地使用几个没有正文的while()
循环的方法。
它假设起点始终介于两者之间。如果不是这样的话,你需要几个快速的额外测试。
另外,我不确定如果起点直接在一个颜色上会发生什么,所以我没有考虑到这一点。
示例: http://jsfiddle.net/tcVxP/4/
var num = 31234,
curr = num,
prev,
next;
while( !colors[--curr] && curr );
prev = colors[curr];
curr = num;
while( !colors[++curr] );
next = colors[curr];
答案 2 :(得分:1)
我只是想在这里跟进;
感谢 quixoto 和 patrick dw ,以获取详细的评论和答案。但是,我的解决方案略有不同。虽然我想保持我使用一维数组的初始方法,但从我所看到的更容易和有效,添加另一个维度,如下所示。这里使用的数组确实具有可预测性,但一旦项目完成,情况可能就不是这样了。
var colors = [
[0, '121D4A'],
[10800, '000000'],
[21600, 'FF5900'],
[32400, 'D3EEF0'],
[43200, '7DCDFF'],
[54000, '7DA6FF'],
[64800, 'FF5900'],
[75600, '31428C'],
[86399, '121D4A'],
];
function gradientStop(color1, color2, gradStop){
var r = Math.floor(gradStop * parseInt(color2.substr(0, 2), 16) + (1 - gradStop) * parseInt(color1.substr(0, 2), 16)).toString(16);
var g = Math.floor(gradStop * parseInt(color2.substr(2, 2), 16) + (1 - gradStop) * parseInt(color1.substr(2, 2), 16)).toString(16);
var b = Math.floor(gradStop * parseInt(color2.substr(4, 2), 16) + (1 - gradStop) * parseInt(color1.substr(4, 2), 16)).toString(16);
return (r.length < 2 ? '0' + r : r) + (g.length < 2 ? '0' + g : g) + (b.length < 2 ? '0' + b : b);
}
function getColor(colors, currentIndex){
for(var i = 0, m = colors.length; i < m; i++){
if(currentIndex >= colors[i][0]){
if(typeof(colors[i + 1]) !== 'undefined'){
if(currentIndex <= colors[i + 1][0]){
return gradientStop(colors[i][1], colors[i + 1][1], (currentIndex - colors[i][0]) / (colors[i + 1][0] - colors[i][0]));
}
}
}
}
}
还;是 Hemlock 这是我Programmatic gradient stops with Javascript问题的扩展,因此是gradientStop()
功能。