2

私がやりたいことは、日付と値のペアのさまざまなセットを取得し、日付に基づいてそれらを結合し、日付が一致しない場合は欠損値を null で埋めることです。

入力として次のようにします。

{"series1":[{'date1':4},{'date2':2},{'date3':6}]}
{"series2":[{'date1':5},{'date2':3},{'date3':4},{'date4':6}]}
{"series3":[{'date2':1},{'date4':9}]}

取得するため:

{"output":[{'date1':[4,5,]},{'date2':[2,3,1]},{'date3':[6,4,]},{'date4':[,6,9]}]}

または、別の見方をすると、次のようにデータを整理できるようにしたいと考えています。

テーブル形式のデータ

シリーズがいくつあっても、どこにギャップがあっても。

この質問を見つけました: SQL style JOIN on JSON dataですが、そのソリューションを必要なものに拡張する方法がわかりません。追加のロジックを追加して、それが必要な場合は n-1 回実行することもできますが、この目的のためにもっとシンプルでエレガントなものが存在するように感じます。

4

2 に答える 2

0

これにアプローチする1つの方法があります。シリーズを繰り返し処理し、一意の日付ごとに、オブジェクトで参照を作成します。次に、それに遭遇したときにその参照に追加します。

js:

var obj = {'series1':[{'date1':4},{'date2':2},{'date3':6}],
'series2':[{'date1':5},{'date2':3},{'date3':4},{'date4':6}],
'series3':[{'date2':1},{'date4':9}]};
console.log(obj);
var output = {};
for(var series in obj ){
    var dateObjects = obj[series];
    for( var dateObj in dateObjects ){
        var dates = dateObjects[dateObj];
        for( var date in dates ){
         if( typeof output[date] == "undefined" ){
          output[date] = [];
         }
         output[date].push(dates[date]);
        }
    }
}
console.log(output);

デモ: http: //jsfiddle.net/Z4ejj/

于 2013-02-12T22:31:13.567 に答える
0

このような日付がある場合:

var t = {
    "series1":[{'date1':4},{'date2':2},{'date3':6}],
    "series2":[{'date1':5},{'date2':3}, {'date3':4},{'date4':6}],
    "series3":[{'date2':1},{'date4':9}]
}

次に、これは機能するはずです:

var output = {};

function getKeys (obj) {
    var keys = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            keys.push(key);
        }
    }
    return keys;
}

getKeys(t).forEach(function (val) {
    t[val].forEach(function (ser) {
        var date = getKeys(ser)[0];
        if (!output.hasOwnProperty(date)) {
            output[date] = [];
        }
        output[date].push(ser[date]);
    });
});

console.log(output);

そして、あなたはこの形式でそれを得るでしょう

Object {date1: Array[2], date2: Array[3], date3: Array[2], date4: Array[2]}
    date1: Array[2]
    date2: Array[3]
    date3: Array[2]
    date4: Array[2]

この形式で元の日付が必要な場合

var original = [
    {"series1":[{'date1':4},{'date2':2},{'date3':6}]},
    {"series2":[{'date1':5},{'date2':3},{'date3':4},{'date4':6}]},
    {"series3":[{'date2':1},{'date4':9}]}
];

getKeys次に、関数の後にこれを追加します

var t = {},
    output = {};

original.forEach(function (obj) {
    var prop = getKeys(obj)[0];
    if (! t.hasOwnProperty(prop) ) {
        t[prop] = {}
    }
    t[prop] = obj[prop];
});
于 2013-02-12T22:25:32.293 に答える