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

时间:2013-10-04 11:42:13

标签: javascript 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,数据),但正如预期的那样失败了。有没有其他方法或我必须迭代每个?我不愿意为我的流程添加另一个循环

6 个答案:

答案 0 :(得分:3)

这是典型的性能与内存问题。避免循环遍历数组的唯一方法(我知道)是维护第二个数据结构,将时间戳映射到数组的索引(或者可能需要的任何数据)。

所以你会有

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.)

如果数据结构是动态更改的,那么您当然需要维护地图数据结构,但是根据您需要查找的上下文,与线性相比,恒定时间查找可能是实时节省的时间查找。

答案 1 :(得分:1)

理想情况下,你应该使用一个对象:

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));

答案 2 :(得分:1)

我认为您需要不同的数据结构。

尝试使用标准的javascript对象({ key: value } - 有时称为地图或字典)来表达您的数据。查找对象中的键是高度优化的(使用称为哈希表的东西)。

如果数组中的索引有任何意义,请将其存储为属性(通常名为_id)。

答案 3 :(得分:0)

自定义跨浏览器解决方案怎么样?

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;
});

答案 4 :(得分:0)

小提琴: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

答案 5 :(得分:0)

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);

jsfiddle

MDN|some Array Method

请注意,此解决方案在找到后停止迭代,不一定在整个数组上,因此对于大型数组来说可能要快得多。