快速从 2D 数组获取索引,无需迭代 jquery

Getting index from 2D array quickly without iteration jquery

本文关键字:迭代 jquery 索引 获取 2D 数组      更新时间:2023-09-26

我有这个 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;
});