2016-08-11 10 views
0

私が得たオブジェクト配列A:私はこのように、配列Bをobjectに変換したいJavaScript:効率的にオブジェクト配列Aをオブジェクト配列Bに変換するにはどうすればよいですか?このよう

[ 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Voltage", 
     "Value": "230.12" 
    }, 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Frequency", 
     "Value": "50.12" 
    }, 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Label": "Power", 
     "Value": "23" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Voltage", 
     "Value": "231.12" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Frequency", 
     "Value": "51.12" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Label": "Power", 
     "Value": "23.4" 
    } 
] 

[ 
    { 
     "Timestamp": "2015-10-01 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    }, 
    { 
     "Timestamp": "2015-10-02 22:22:22", 
     "Voltage": "231.12", 
     "Frequency": "51.12", 
     "Power": "23.4" 
    } 
] 

私はタイムスタンプを取得し、再ループを再びラベルを取得するためにループしました新しいオブジェクト配列を形成するための値。それは動作しますが、データが数十万個のオブジェクト配列になると効率が悪くなり、ブラウザがクラッシュします。誰かがより良い方法を考えてください。どうもありがとう。

+3

なぜあなたは別のタイムスタンプ(2015年10月2日22時22分22秒と2015年10月2日午後12時00分○○秒)から一緒にデータを入れていますか? – Bergi

+0

入力はタイムスタンプでソートされていますか?はいの場合、1回の実行で簡単に実行できます。 – Bergi

+0

plsはあなたの機能をより詳しく説明します。どのように配列Bを作るのですか? – ajaykumar

答えて

1

JSONは単なるトランスポート/ストレージ形式です。一般的に、直接操作しようとするものではありません。実際のJavaScriptオブジェクト/配列を操作するのに最適です。あなたは、その後経由だけでループを

var outputArray = []; 
var currentObj = null; 
originalArray.forEach(function (measurement) { 
    if (!currentObj || currentTimestamp !== measurement.Timestamp) { 
    currentTimestamp = measurement.Timestamp; 
    currentObj = { 
     Timestamp: measurement.Timestamp; 
    } 
    outputArray.push(currentObj); 
    } 
    currentObj[measurement.Label] = measurement.Value; 
}); 

ことができ、あなたが行くように新しいアレイを構築する:

あなたは元の配列のソート順序を保証することができた場合は、このような何かを試してみてください。ご希望の出力として

+0

こんにちはブラッド、あなたも働いた!あなたとDAXスクリプトの両方が私のものよりも優れています。ありがとう、今日私は数十万のデータでテストしてみましょう。再度、感謝します。 https://jsfiddle.net/51r7onnm/ –

+0

驚くべきことに、foreachとgenericタイムスタンプを使用すると、タイムスタンプ付きの何十万ものデータポイントを投入するときに、array.reduceメソッドよりもはるかに高速な応答を比較できます。そして、減量は非常にきちんとしたまっすぐに見える!正直言って、DAXが矢印機能を使うのを見ると、かなり前進しています。どうもありがとうございました!あなたたちは天才です!私はあなたのスニペットから多くを学んだ。 –

1

は、タイムスタンプの時間これはタイムスタンプの一部をトリミングしますが無視して示した - それが問題の間違いだった場合、私は自分で

var b = a.reduce((acc, cur) => { 
    var strippedTimestamp = cur.Timestamp.substring(1, 10) + " 00:00:00"; 
    var obj = acc.find(e => e.Timestamp == strippedTimestamp); 
    if (!obj) { 
    obj = { Timestamp: strippedTimestamp }; 
    acc.push(obj); 
    } 
    obj[cur.Label] = cur.Value; 
    return acc; 
}, []); 
をその一部を除去することができるはずだと思います

が出力されます

[ 
    { 
     "Timestamp": "015-10-01 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    }, 
    { 
     "Timestamp": "015-10-02 00:00:00", 
     "Voltage": "230.12", 
     "Frequency": "50.12", 
     "Power": "23" 
    } 
] 
+0

ありがとうございましたDAX、あなたのコードは私のために働いていますが、除外されたタイムスタンプは削除されました。タイムスタンプについて誤って入力してしまって申し訳ありませんでしたが、マシンはタイムスタンプ付きの各データポイントを返しますが、フロントエンドのディスプレイはタイムスタンプでグループ化します。 https://jsfiddle.net/ow2d6f72/ –

関連する問題