Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找最接近给定索引的javascript稀疏数组的索引_Javascript_Arrays - Fatal编程技术网

查找最接近给定索引的javascript稀疏数组的索引

查找最接近给定索引的javascript稀疏数组的索引,javascript,arrays,Javascript,Arrays,假设我有一个稀疏数组,值“foo”分配给索引100,值“bar”分配给索引130。如何“舍入”任何给定索引,使其始终返回最近定义索引的值 例如:如果我试图获取索引103处的值,我应该获取“foo”,而不是未定义。同样地,如果99的指数太低,我仍然会得到“foo”,而115的指数会在130处四舍五入到“bar” 这应该完全独立于(且与)存储在索引中的值无关 编辑:使用压缩数组和括号搜索在O(log(n))时间O(n)时间内求解。请注意,这要求压缩数组从低到高排序 var sparseArr = [

假设我有一个稀疏数组,值“foo”分配给索引100,值“bar”分配给索引130。如何“舍入”任何给定索引,使其始终返回最近定义索引的值

例如:如果我试图获取索引103处的值,我应该获取“foo”,而不是未定义。同样地,如果99的指数太低,我仍然会得到“foo”,而115的指数会在130处四舍五入到“bar”

这应该完全独立于(且与)存储在索引中的值无关

编辑:使用压缩数组和括号搜索在O(log(n))时间O(n)时间内求解。请注意,这要求压缩数组从低到高排序

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倍)所以我想找到一个更好的答案。@布伦丹沃尔什在你的问题中发布你的代码,如果可能的话,在小提琴上做一个工作例子。考虑使用一个对象代理。