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

如果你有这样的日期:

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 回答
0

这是解决此问题的一种方法。遍历您的系列,并为每个唯一日期在对象中进行引用。然后在遇到它时附加到该引用。

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 回答