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

时间:2016-08-29 17:27:06

标签: javascript arrays

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

例如:如果我试图获取索引103处的值,我应该得到“foo”而不是undefined。同样,过低的99指数仍然应该给我“foo”,而115应该在指数130处向“bar”汇总。

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

编辑:使用精简数组和包围搜索在 O(log(n))时间 O(n)时间内解决。请注意,这需要将压缩数组从低到高排序。

SELECT *FROM AffiliatedRegister WHERE Username=InputUserName

tf.contrib.learn.read_keyed_batch_examples

的示例

3 个答案:

答案 0 :(得分:0)

您还没有谈到浏览器支持,所以这里是使用一些数组操作函数(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)
}

您可以在Babel online REPL上尝试。

答案 1 :(得分:0)

你可以这样做;



function findCloseIndex(a,idx){
  return Object.keys(a)
               .map(k => [k,Math.abs(k-idx)])
               .sort((a,b) => a[1] - b[1])[0][0];
}

var arr = [],
  close;

arr[100] = "foo";
arr[130] = "bar";

close = arr[findCloseIndex(arr,125)];
console.log(close);
close = arr[findCloseIndex(arr,78)];
console.log(close);




答案 2 :(得分:0)

您可以使用Array#some,它只迭代非解析的项目。



function roundGet(index) {
    var last = -Infinity,
        value;
    a.some(function (v, i) {
        if (Math.abs(last - index) <= Math.abs(i - index)) {
            return true;
        }
        value = v;
        last = i;
    });
    return value;
}

var a = [];
a[100] = 'foo';
a[130] = 'bar';
a[150] = 'foobar';

console.log(roundGet(0));    // "foo"
console.log(roundGet(99));   // "foo"
console.log(roundGet(103));  // "foo"
console.log(roundGet(115));  // "foo"
console.log(roundGet(116));  // "bar"
console.log(roundGet(186));  // "foobar"
console.log(roundGet(1000)); // "foobar"
&#13;
&#13;
&#13;

ES6

&#13;
&#13;
function roundGet(index) {
    var last = -Infinity,
        value;
    a.some((v, i) =>
        Math.abs(last - index) <= Math.abs(i - index) || (value = v, last = i, false));
    return value;
}

var a = [];
a[100] = 'foo';
a[130] = 'bar';
a[150] = 'foobar';

console.log(roundGet(0));    // "foo"
console.log(roundGet(99));   // "foo"
console.log(roundGet(103));  // "foo"
console.log(roundGet(115));  // "foo"
console.log(roundGet(116));  // "bar"
console.log(roundGet(186));  // "foobar"
console.log(roundGet(1000)); // "foobar"
&#13;
&#13;
&#13;