查找最接近给定索引的javascript稀疏数组的索引
假设我有一个稀疏数组,值“foo”分配给索引100,值“bar”分配给索引130。如何“舍入”任何给定索引,使其始终返回最近定义索引的值 例如:如果我试图获取索引103处的值,我应该获取“foo”,而不是未定义。同样地,如果99的指数太低,我仍然会得到“foo”,而115的指数会在130处四舍五入到“bar” 这应该完全独立于(且与)存储在索引中的值无关 编辑:使用压缩数组和括号搜索在O(log(n))时间O(n)时间内求解。请注意,这要求压缩数组从低到高排序查找最接近给定索引的javascript稀疏数组的索引,javascript,arrays,Javascript,Arrays,假设我有一个稀疏数组,值“foo”分配给索引100,值“bar”分配给索引130。如何“舍入”任何给定索引,使其始终返回最近定义索引的值 例如:如果我试图获取索引103处的值,我应该获取“foo”,而不是未定义。同样地,如果99的指数太低,我仍然会得到“foo”,而115的指数会在130处四舍五入到“bar” 这应该完全独立于(且与)存储在索引中的值无关 编辑:使用压缩数组和括号搜索在O(log(n))时间O(n)时间内求解。请注意,这要求压缩数组从低到高排序 var sparseArr = [
var sparseArr = [];
sparseArr[100] = "foo";
sparseArr[130] = "bar";
sparseArr[150] = "foobar";
var condensedArr = [100, 130, 150];
function roundGet(index) {
var mid;
var lo = 0;
var hi = condensedArr.length - 1;
while (hi - lo > 1) {
mid = Math.floor((lo + hi) / 2);
if (condensedArr[mid] < index) {
lo = mid;
} else {
hi = mid;
}
}
if (index - condensedArr[lo] <= condensedArr[hi] - index) {
return sparseArr[condensedArr[lo]];
}
return sparseArr[condensedArr[hi]];
}
var-sparseArr=[];
sparseArr[100]=“foo”;
sparseArr[130]=“巴”;
sparseArr[150]=“foobar”;
var condendarr=[100130150];
函数roundGet(索引){
var-mid;
var-lo=0;
var hi=冷凝器长度-1;
同时(高-低>1){
中间=数学楼层((低+高)/2);
if(冷凝器[中间]<索引){
lo=中;
}否则{
高=中;
}
}
如果(index-condendarr[lo]您还没有提到任何关于浏览器支持的内容,那么下面是使用一些数组操作函数(IE9+)和ES2015函数箭头语法的解决方案
function findIndex(array, searchedIndex) {
return Object.keys(array)
.map(e => ({val: parseInt(e, 10), abs: Math.abs(parseInt(e, 10) - searchedIndex)}))
.reduce((min, e) => min[0].val > e.abs ? [{val: e.abs, i: e.val}] : min, [{val: Number.MAX_VALUE, i: -1}])
.reduce((v, min) => min.val !== Number.MAX_VALUE ? array[min.i] : v, -1)
}
你可以试穿一下。你可以按以下步骤来做
函数findCloseIndex(a,idx){
返回对象。键(a)
.map(k=>[k,Math.abs(k-idx)])
.sort((a,b)=>a[1]-b[1])[0][0];
}
var arr=[],
关
arr[100]=“foo”;
arr[130]=“巴”;
关闭=arr[findCloseIndex(arr,125)];
控制台日志(关闭);
关闭=arr[findCloseIndex(arr,78)];
console.log(close);
您可以使用,它只迭代非稀疏项
函数roundGet(索引){
var last=-无穷大,
价值
a、 一些(函数(v,i){
如果(Math.abs(last-index)您至少应该向我们展示您目前拥有的内容,那么不是代码编写服务,您希望如何检索这些值?对于没有值的索引,本机数组索引器将始终返回undefined…@AdamBuchanTransmisth到目前为止,我已经创建了一个单独的非稀疏数组,其中列出了所有占用的索引(在本例中,[100130]),并使用一个简单的算法在第二个数组上循环,找到与我的索引最接近的数字。但是,它的效率非常快(n^2倍)所以我想找到一个更好的答案。@布伦丹沃尔什在你的问题中发布你的代码,如果可能的话,在小提琴上做一个工作例子。考虑使用一个对象代理。