mijページのクエリからの(JS)配列があり、次のようになります。
12349,1,1,1,12345,2,2,2,123457,3,3,3
5桁の数字は「タイムスタンプ」の例であり、1桁はタイムスタンプに属する価格です。タイムスタンプに基づいて配列を並べ替えたいが、価格がタイムスタンプよりも遅れているようにしたい。したがって、配列をソーイングした後は、次のようになります。
12345,2,2,2,12349,1,1,1,123457,3,3,3
これを行う方法?
mijページのクエリからの(JS)配列があり、次のようになります。
12349,1,1,1,12345,2,2,2,123457,3,3,3
5桁の数字は「タイムスタンプ」の例であり、1桁はタイムスタンプに属する価格です。タイムスタンプに基づいて配列を並べ替えたいが、価格がタイムスタンプよりも遅れているようにしたい。したがって、配列をソーイングした後は、次のようになります。
12345,2,2,2,12349,1,1,1,123457,3,3,3
これを行う方法?
var input=[12349,1,1,1,12345,2,2,2,123457,3,3,3]
ステップ 1: 少しだけ良い構造に変換します (セマンティクスはわかりませんが、わかります)。通常、この手順は必要ありません。
var temp=[];
for(int i=0; i<input.length; i+=4){ //assuming the form T,x,x,x{,T,x,x,x}
temp.push(input.slice(i,i+3))
}
ステップ 2: 並べ替えを行います。これは、適切なデータ構造を使用している場合に必要な唯一のことです (ただし、 を使用する場合を除きますreturn a.timestamp-b.timestamp
)。
temp.sort(function(a,b){return a[0]-b[0]})
ステップ 3 (オプション) : 元に戻す:
var out=[];
for(int i=0; i<temp.length; i++){
for(int j=0; j<temp[i].length; j++){
out.push(temp[i][j])
}
}
これを処理する 1 つの方法を次に示します。
var source = [12345,2,2,2,12349,1,1,1,123457,3,3,3];
function sort() {
var timeslices = [];
var curr;
for (var i=0; i < source.length; i++) {
if (source[i] > 9999) {
if (curr) {
timeslices.push(curr);
}
curr = {
time : source[i],
prices: []
};
}
else {
curr.prices.push(source[i]);
}
}
timeslices.push(curr);
return timeslices.sort(function(a,b) {
return a.time - b.time;
});
}
console.dir(sort());
各タイムスタンプに関連付けられている価格の数について、私は何も仮定していません。また、6桁の数字もタイムスタンプであると想定しています。
配列を再度平坦化することはしませんでしたが、必要に応じてそれを行うこともできますが、データをより便利な構造に保つ方が理にかなっています。
このような配列にデータを格納するのは本当に間違っているので、多次元配列を使用する必要があります。
[0]=>{[0]12345,[1]1}
[1]=>{[0]23456,[1]2}
またはさらに良い連想配列:
[0]=>{['timestamp']12345,['price']1}
[1]=>{['timestamp']23456,['price']2}
お役に立てば幸いです。
編集:これはコードではありません。配列の構造を表示しようとしました。