2

この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, data) を試しましたが、予想どおりこれは失敗します。他の方法はありますか、またはそれぞれを反復する必要がありますか? プロセスに別のループを追加するのは気が進まない

4

6 に答える 6

3

これは、一般的なパフォーマンスとメモリの問題です。配列のループを回避する唯一の方法 (私が知っている) は、タイムスタンプを配列のインデックス (または必要なデータ) にマッピングする 2 番目のデータ構造を維持することです。

だからあなたは持っているでしょう

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

データ構造が動的に変更される場合、もちろんマップ データ構造を維持する必要がありますが、ルックアップが必要なコンテキストによっては、一定時間のルックアップは、線形時間のルックアップと比較してリアルタイムの節約になる可能性があります。

于 2013-10-04T11:50:12.840 に答える
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 に答える
1

別のデータ構造が必要だと思います。

標準の JavaScript オブジェクト ({ key: value }マップまたは辞書と呼ばれることもあります) を使用して、データを表現してみてください。オブジェクト内のキーの検索は高度に最適化されています (ハッシュ テーブルと呼ばれるものを使用)。

配列のインデックスに何らかの意味がある場合は、それをプロパティ (通常は という名前_id) として保存します。

于 2013-10-04T11:55:28.917 に答える
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 に答える