假设我有一个稀疏数组,其值“foo”分配给索引100,值“bar”分配给索引130.如何“舍入”任何给定索引,使其始终返回最近的值定义指数?
例如:如果我试图获取索引103处的值,我应该得到“foo”而不是undefined。同样,过低的99指数仍然应该给我“foo”,而115应该在指数130处向“bar”汇总。
这应该完全独立于(并且与索引中存储的值无关)。
编辑:使用精简数组和包围搜索在 O(log(n))时间 O(n)时间内解决。请注意,这需要将压缩数组从低到高排序。
SELECT *FROM AffiliatedRegister WHERE Username=InputUserName
的示例
答案 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;
ES6
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;