2013-02-12 2 views
2

Что я хочу сделать, это захватить кучу разных наборов дат: пары значений, объединить их вместе с датой и заполнить отсутствующие значения нулевым, если даты не будут 't матч.Javascript «JOIN» на множестве массивов различной длины

Как это в качестве входных данных:

{"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]}]} 

Или смотреть на это с другой стороны, я хочу, чтобы иметь возможность организовать такие данные:

table format of data

Независимо от того, сколько рядов у меня будет, и независимо от того, где могут быть пробелы быть.

Я нашел этот вопрос: SQL style JOIN on JSON data, но я не уверен, как расширить это решение до того, что мне нужно. Я мог бы добавить дополнительную логику, а затем запустить ее n-1 раз, если это то, что нужно сделать, но на самом деле кажется, что для этой цели будет существовать нечто более простое и элегантное.

+0

как примечание, ценности объекта, как то, что вы здесь '{ 'date1', 4}' не могут быть разделены запятой, вам нужно отформатировать они как это '{'date1': 4}' – Ryan

+0

oh right, я изначально имел их как '['date', 4,5,]', но нашел это немного грязным таким образом. не изменил все правильно, oops – UnLucky

ответ

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]; 
}); 
+0

Любой способ нажать пустое значение для каждой серии, если не было значения для данной даты? Чтобы всегда получить 'Array [3]' в этом случае, например '0: 4, 1: 5, 2:' – UnLucky

+0

@UnLucky определить пустые значения как например, false, null или empty string. Затем они будут добавлены к выходу, но без какого-либо числа – richie

0

Вот один из способов приблизиться к этому. Итерации через вашу серию и для каждой уникальной даты сделайте ссылку в объекте. Затем добавьте эту ссылку в качестве вашей встречи.

ЯШ:

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/

Смежные вопросы