2

我有这个二维数组如下:

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, data) 但正如预期的那样失败了。还有其他方法还是我必须遍历每个方法?我不愿意在我的流程中添加另一个循环

4

6 回答 6

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

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

于 2013-10-04T11:50:12.840 回答
1

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

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

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

于 2013-10-04T11:55:28.917 回答
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));
于 2013-10-04T11:51:51.290 回答
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;
});
于 2013-10-04T12:14:13.470 回答
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|一些数组方法

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

于 2013-10-04T12:44:19.277 回答
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
于 2013-10-04T12:32:05.917 回答