2014-11-25 67 views
1

我有以下形式的JSON字符串:如何將以JSON格式返回的數據分組並返回?

[ 
    {"ID":153,"CircuitID":53,"StartTime":"2014-11-12 12:45:00","EventFormatID":224,"TotalPlaces":8,"BookedPlaces":0,"ProvisionalPlaces":0}, 
    {"ID":161,"CircuitID":53,"StartTime":"2014-11-12 17:15:00","EventFormatID":224,"TotalPlaces":0,"BookedPlaces":0,"ProvisionalPlaces":0}, 
    {"ID":734,"CircuitID":53,"StartTime":"2014-11-12 18:30:00","EventFormatID":231,"TotalPlaces":14,"BookedPlaces":0,"ProvisionalPlaces":0} 
] 

在發生事件格式ID和Circuit ID的,我將返回名稱

我需要做的是組結果由事件格式ID並返回結果的格式如下:

Event 224 : 12:45 (8 places available), 17:15 (0 places available) 
Event 231 : 18:30 (14 places available) 

我似乎無法弄清楚如何遍歷數據,通過事件格式ID組也呈現它需要的格式!

謝謝

+0

這是1對多的。您需要創建一個對象,其中每個事件格式ID都是一個鍵,每個鍵的值都是一個相關對象的數組。值數組的每個元素都將是一個包含原始JSON的鍵和值的對象。所有這些都可以在for循環中手動完成。 – Paul 2014-11-25 11:46:31

回答

1

你可以使用任何額外的庫嗎?我會用lo-dash這將使這個相對簡單:

var grouped = _.groupBy(data, "EventFormatID"); 
_(grouped).forEach(function (group, key) { 
    console.log("Event:" + key); 
    _(group).forEach(function (course) { 
     console.log(course.StartTime + " (" + course.TotalPlaces + " places available)"); 
    }); 
}); 

顯然上述日誌到控制檯的例子,但它會是相當簡單的改變來建立的任何字符串或對象需要。

0

這是lodash /下劃線更容易,甚至與ES5數組和對象的方法,但既然你問到純JS:

var data = {}, results = [], i, j, id, time, obj, evts; // obj is your object above 
for (i=0; i<obj.length; i++) { 
    id = obj[i].EventFormatID; 
    time = obj[i].StartTime; // you can simplify to get just the time, not the datetime, if you prefer 
    data[id] = data[id] || []; 
    data[id].push({"time":time,"places":obj[i].TotalPlaces}); 
} 
// now you have a proper data structure, just print it out 
for (i in data) { 
    if (data.hasOwnProperty(i)) { 
    // just show the output properly formatted 
    evts = []; 
    for (j=0;i<data[i].length;j++) { 
     evts.push(data[i][j].time+" ("+data[i][j].places+" places available)"); 
    } 
    results.push("Event "+i+" : "+evts.join(",")); 
    } 
} 

ES5使這容易得多

var data = {}, results = [], obj; // obj is your object above 
obj.forEach(function(val,i) { 
    data[val.EventFormatID] = data[val.EventFormatID] || []; 
    data[val.EventFormatID].push({"time":val.StartTime,"places":val.TotalPlaces}); 
}); 
// now you have a proper data structure, just print it out 
Object.keys(data).forEach(function(key) { 
    var value = data[key], evts = []; 
    value.forEach(function(elm) { 
    evts.push(elm.time+" ("+elm.places+" places available)"); 
    }); 
    results.push("Event "+key+" : "+evts.join(",")); 
}); 

而且lodash更容易。

0

請看看是:

http://jsfiddle.net/m260n5ud/

HTML

<div id="contentDiv"></div> 

JS

function tidyUp(jsonArray) { 
    var myObject = {}; 
    for (i = 0; i < jsonArray.length; i++) { 
     var key = jsonArray[i]['EventFormatID']; 
     var time = jsonArray[i]['StartTime'].replace(' ', ':').split(/[- :]/); 
     time = time[3] + ":" + time[4]; 
     var totalPlace = jsonArray[i]['TotalPlaces']; 

     if (myObject[key] == null) { 
      myObject[key] = "Event : " + key + " : " + time + " (" + totalPlace + " places available)"; 
     } else { 
      myObject[key] += ", " + time + " (" + totalPlace + " places available)"; 
     } 
    } 
    console.log(myObject); 

    for (var k in myObject) { 
     document.getElementById('contentDiv').innerHTML += myObject[k] + "<br/>"; 
    } 
} 
+0

如果你不想第三方插件,你可以使用這個純粹的JS代碼。你可以檢查一下嗎? – caslaner 2014-11-25 13:12:51