快速从 2D 数组获取索引,无需迭代 jquery
Getting index from 2D array quickly without iteration jquery
我有这个 2D 数组如下:
var data = [[1349245800000, 11407.273], [1349247600000, 12651.324],
[1349249400000, 11995.017], [1349251200000, 11567.533],
[1349253000000, 11126.858], [1349254800000, 9856.455],
[1349256600000, 8901.779], [1349258400000, 8270.123],
[1349260200000, 8081.841], [1349262000000, 7976.148],
[1349263800000, 7279.652], [1349265600000, 6983.956],
[1349267400000, 7823.309], [1349269200000, 6256.398],
[1349271000000, 5487.86], [1349272800000, 5094.47],
[1349274600000, 4872.403], [1349276400000, 4168.556],
[1349278200000, 4501.939], [1349280000000, 4150.769],
[1349281800000, 4061.599], [1349283600000, 3773.741],
[1349285400000, 3876.534], [1349287200000, 3221.753],
[1349289000000, 3330.14], [1349290800000, 3147.335],
[1349292600000, 2767.582], [1349294400000, 2638.549],
[1349296200000, 2477.312], [1349298000000, 2270.975],
[1349299800000, 2207.568], [1349301600000, 1972.667],
[1349303400000, 1788.853], [1349305200000, 1723.891],
[1349307000000, 1629.002], [1349308800000, 1660.084],
[1349310600000, 1710.227], [1349312400000, 1708.039],
[1349314200000, 1683.354], [1349316000000, 2236.317],
[1349317800000, 2228.405], [1349319600000, 2756.069],
[1349321400000, 4289.437], [1349323200000, 4548.436],
[1349325000000, 5225.245], [1349326800000, 6261.156],
[1349328600000, 8103.636], [1349330400000, 10713.788]]
如何获取数组中值1349247600000的索引? 我已经尝试过 $.inArray(1349247600000,数据),但正如预期的那样,这失败了。 还有其他方法还是我必须遍历每个方法?我不愿意在我的流程中添加另一个循环
这是一个典型的性能与内存问题。避免循环遍历数组的唯一方法(据我所知)是维护第二个数据结构,将时间戳映射到数组的索引(或任何可能需要的数据)。
所以你会有
var data = [
[1349245800000, 11407.273],
[1349247600000, 12651.324],
// ...
[1349330400000, 10713.788]
];
// the timestamps pointing at their respective indices
var map = {
'1349245800000': 0, // 0
'1349247600000': 1, // 1
// ...
'1349330400000': 42, // n - 1 (the length of the data array minus one)
}
这样,您可以使用更多内存,但在需要给定时间戳所属的数组中的项索引时具有恒定的查找时间。
要获取给定时间戳的索引,请执行以下操作:
map['1349247600000']; // resulting in 1 (e.g.)
如果数据结构是动态更改的,您当然需要维护地图数据结构,但根据您需要查找的上下文,与线性时间查找相比,常量时间查找可能会节省大量时间。
我认为你需要一个不同的数据结构。
尝试使用标准的javascript对象({ key: value }
- 有时称为地图或字典)来表达您的数据。在对象中查找键是高度优化的(使用称为哈希表的东西)。
如果数组中的索引有任何含义,请将其存储为属性(通常名为 _id
)。
理想情况下,您应该为此使用一个对象:
var data = {
'1349247600000': 12651.324
}
您可以像这样访问:
data['1349247600000'];
但是,在此期间,这可能是一个不错的解决方案(IE9及更高版本):
var search = 1349247600000;
function findIndex(data, search) {
var filter = data.filter(function (el, i) {
el.unshift(i);
return el[1] === search;
});
return filter[0][0];
}
console.log(findIndex(data, search));
小提琴:http://jsfiddle.net/CLa56/
var searchElement = 1349251200000;
var strdata = data.toString();
var newdata = eval("[" + strdata + "]");
var indexsearch = newdata.indexOf(searchElement);
var index = indexsearch/2; // 2 because array.length = 2
var params = {id: 1349251200000, index: -1};
data.some(function (e, i) {
if (e[0] === this.id) {
this.index = i;
return true;
}
}, params);
console.log(params.index);
斯菲德尔
MDN|一些数组方法
请注意,此解决方案在找到后停止迭代,不一定是整个数组,因此对于大型数组可能会快得多。
自定义跨浏览器解决方案呢?
function findIndexBy(a, fn) {
var i = 0, l = a.length;
for (; i < l; i++) {
if (fn(a[i], i)) {
return i;
}
}
return -1;
}
用法:
var list = [[1],[2],[3]], idx;
// idx === 1
idx = findIndexBy(list, function (item, i) {
return item[0] === 2;
});
// idx === -1
idx = findIndexBy(list, function (item, i) {
return item[0] === 4;
});
相关文章:
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- jQuery-迭代不正确?(太长,无法执行)
- 如何在Jquery中迭代JSON数组
- 如何使用jQuery迭代id名称的变体(如idname1、idname2)
- 如何在我传递给视图的ViewModel集合中获得jQuery可选对象的值,以作为有序列表进行迭代
- jQuery eq()导致无限迭代
- JS对象->来自jquery ajax的JSON提交->php迭代
- jQuery:尝试迭代选择选项值
- 函数崩溃,因为太多迭代jQuery
- 快速从 2D 数组获取索引,无需迭代 jquery
- 如何迭代jquery选择器的结果
- 正在迭代jquery对象
- 使用accumulator迭代jquery对象
- 迭代Jquery中启用的选项卡
- 在Chrome中迭代jQuery JSON对象,它改变了顺序
- 迭代jQuery集合,而不必重新构建jQuery对象
- 迭代jQuery数组
- 如何迭代jquery.map的输出
- 如何将.delay添加到.点击.每次迭代(jquery)