2016-01-24 4 views
6

मैं showtimesData से showtimesByLocationByDate

किसी भी विचार को किसी भी तृतीय पक्ष लाइब्रेरी का उपयोग किए बिना और केवल शुद्ध जावास्क्रिप्ट का उपयोग किए बिना इसे कैसे करना है? अन्यथा, मैं इसके लिए किस तीसरे पक्ष पुस्तकालय का उपयोग कर सकता हूं?अपने गुणों में से एक द्वारा जावास्क्रिप्ट ऑब्जेक्ट सरणी को कैसे समूहित करें?

var showtimesData = [ 
     {"location":"location1", "date":"31-12-2016", "time":"1:00"}, 
     {"location":"location1", "date":"31-12-2016", "time":"2:00"}, 
     {"location":"location1", "date":"01-01-2017", "time":"3:00"}, 
     {"location":"location1", "date":"01-01-2017", "time":"4:00"}, 
     {"location":"location2", "date":"31-12-2016", "time":"1:00"}, 
     {"location":"location2", "date":"31-12-2016", "time":"2:00"}, 
     {"location":"location2", "date":"01-01-2017", "time":"3:00"}, 
     {"location":"location2", "date":"01-01-2017", "time":"4:00"}, 
    ]; 
    var showtimesByLocationByDate = [ 
     { 
      "location":"location1", 
      "dates":[ 
       { 
        "date":"31-12-2016", 
        "times":["1:00","2:00"] 
       }, 
       { 
        "date":"01-01-2017", 
        "times":["3:00","4:00"] 
       } 
      ] 
     }, 
     { 
      "location":"location2", 
      "dates":[ 
       { 
        "date":"31-12-2016", 
        "times":["1:00","2:00"] 
       }, 
       { 
        "date":"01-01-2017", 
        "times":["3:00","4:00"] 
       } 
      ] 
     }, 
    ]; 
+0

क्या इसे उस विशिष्ट प्रारूप का पालन करना है? डेट लुकअप बहुत तेज होगा यदि यह किसी ऑब्जेक्ट की संपत्ति होगी। – MinusFour

+0

यदि मैं तिथियों को गुणों के रूप में सेट करना चाहता था, तो क्या मैं गुणों के माध्यम से तारों को प्राप्त करने के लिए गुणों के माध्यम से लूप कर सकता हूं? – davidchoo12

+0

हां, ऑब्जेक्ट के गुणों के माध्यम से लूप करना संभव है। – MinusFour

उत्तर

4

इस प्रस्ताव सरणी आइटम संदर्भित करने के लिए एक अस्थायी वस्तु के साथ सिर्फ Array.prototype.reduce() की सुविधा है।

var showtimesData = [{ "location": "location1", "date": "31-12-2016", "time": "1:00" }, { "location": "location1", "date": "31-12-2016", "time": "2:00" }, { "location": "location1", "date": "01-01-2017", "time": "3:00" }, { "location": "location1", "date": "01-01-2017", "time": "4:00" }, { "location": "location2", "date": "31-12-2016", "time": "1:00" }, { "location": "location2", "date": "31-12-2016", "time": "2:00" }, { "location": "location2", "date": "01-01-2017", "time": "3:00" }, { "location": "location2", "date": "01-01-2017", "time": "4:00" }, ], 
 
    showtimesByLocationByDate = showtimesData.reduce(function (r, a) { 
 
     var o; 
 
     if (!(a.location in r.obj)) { 
 
      o = { location: a.location, dates: [] }; 
 
      r.obj[a.location] = { dates: o.dates }; 
 
      r.array.push(o); 
 
     } 
 
     if (!(a.date in r.obj[a.location])) { 
 
      o = { date: a.date, times: [] }; 
 
      r.obj[a.location].dates.push(o); 
 
      r.obj[a.location][a.date] = o.times; 
 
     } 
 
     r.obj[a.location][a.date].push(a.time); 
 
     return r; 
 
    }, { array: [], obj: {} }).array; 
 

 
document.write('<pre>' + JSON.stringify(showtimesByLocationByDate, 0, 4) + '</pre>');

बोनस: किसी दिए गए डेटा संरचना के साथ जेनेरिक संस्करण

var showtimesData = [{ "location": "location1", "date": "31-12-2016", "time": "1:00" }, { "location": "location1", "date": "31-12-2016", "time": "2:00" }, { "location": "location1", "date": "01-01-2017", "time": "3:00" }, { "location": "location1", "date": "01-01-2017", "time": "4:00" }, { "location": "location2", "date": "31-12-2016", "time": "1:00" }, { "location": "location2", "date": "31-12-2016", "time": "2:00" }, { "location": "location2", "date": "01-01-2017", "time": "3:00" }, { "location": "location2", "date": "01-01-2017", "time": "4:00" }, ], 
 
    structure = [ 
 
     { key: 'location', data: 'dates' }, 
 
     { key: 'date', data: 'times' }, 
 
     { key: 'time' } 
 
    ], 
 
    showtimesByLocationByDate = showtimesData.reduce(function (r, a) { 
 
     var properties = structure.slice(), 
 
      lastKey = properties.pop().key; 
 

 
     properties.reduce(function (rr, b) { 
 
      var o = {}, 
 
       p = {}, 
 
       key = b.key, 
 
       value = a[key], 
 
       array = b.data; 
 

 
      if (!(value in rr.obj)) { 
 
       o[key] = value; 
 
       o[array] = []; 
 
       p[array] = o[array]; 
 
       rr.obj[value] = p; 
 
       rr.array.push(o); 
 
      } 
 
      return { array: rr.obj[value][array], obj: rr.obj[value] }; 
 
     }, r).array.push(a[lastKey]); 
 

 
     return r; 
 
    }, { array: [], obj: {} }).array; 
 

 
document.write('<pre>' + JSON.stringify(showtimesByLocationByDate, 0, 4) + '</pre>');

+0

आप उत्तर बहुत सटीक है, लेकिन मैं बस सोच रहा था कि इसे और अधिक सामान्य बनाने का कोई तरीका है? – Rajesh

+0

@ राजेश, यह डेटा संरचना पर निर्भर करता है और यह कितना सामान्य होना चाहिए। –

+0

मैं बस सोच रहा था कि क्या हम एक ऐसा फ़ंक्शन बना सकते हैं जहां हम डेटा और संपत्ति को समूह में पास करते हैं, और यह समूहबद्ध मान देता है। निम्नलिखित [JSFiddle] (https://jsfiddle.net/RajeshDixit/sktkjpno/) है जो मैंने अभी तक कोशिश की है। – Rajesh

4

मैं इस बदलाव का प्रस्ताव चाहते हैं:

var showtimesData = [ 
 
     {"location":"location1", "date":"31-12-2016", "time":"1:00"}, 
 
     {"location":"location1", "date":"31-12-2016", "time":"2:00"}, 
 
     {"location":"location1", "date":"01-01-2017", "time":"3:00"}, 
 
     {"location":"location1", "date":"01-01-2017", "time":"4:00"}, 
 
     {"location":"location2", "date":"31-12-2016", "time":"1:00"}, 
 
     {"location":"location2", "date":"31-12-2016", "time":"2:00"}, 
 
     {"location":"location2", "date":"01-01-2017", "time":"3:00"}, 
 
     {"location":"location2", "date":"01-01-2017", "time":"4:00"}, 
 
    ]; 
 
    
 
var transformed = showtimesData.reduce(function(obj, show){ 
 
    //var { location, date, time } = show; //if destructuring is available 
 
    var location = show.location, 
 
     date = show.date, 
 
     time = show.time, 
 
     objLocation = obj[location] = obj[location] || { dates : { } }, 
 
     dates = objLocation.dates, 
 
     date = dates[date] = dates[date] || [ ]; 
 

 
     date.push(time); 
 
     return obj; 
 
}, {}); 
 
results.innerHTML = JSON.stringify(transformed, null, '\t');
<pre id="results"></pre>

यदि आपको वास्तव में यह है कि करने के लिए बदलना चाहते हैं, मैं इस बदलाव का प्रस्ताव grabing और अपने प्रस्तावित संरचना से मैप चाहते हैं।

var showtimesData = [ 
 
     {"location":"location1", "date":"31-12-2016", "time":"1:00"}, 
 
     {"location":"location1", "date":"31-12-2016", "time":"2:00"}, 
 
     {"location":"location1", "date":"01-01-2017", "time":"3:00"}, 
 
     {"location":"location1", "date":"01-01-2017", "time":"4:00"}, 
 
     {"location":"location2", "date":"31-12-2016", "time":"1:00"}, 
 
     {"location":"location2", "date":"31-12-2016", "time":"2:00"}, 
 
     {"location":"location2", "date":"01-01-2017", "time":"3:00"}, 
 
     {"location":"location2", "date":"01-01-2017", "time":"4:00"}, 
 
    ]; 
 
    
 
var transformed = showtimesData.reduce(function(obj, show){ 
 
    //var { location, date, time } = show; //if destructuring is available 
 
    var location = show.location, 
 
     date = show.date, 
 
     time = show.time, 
 
     objLocation = obj[location] = obj[location] || { dates : { } }, 
 
     dates = objLocation.dates, 
 
     date = dates[date] = dates[date] || [ ]; 
 

 
     date.push(time); 
 
     return obj; 
 
}, {}); 
 

 
var secondTransformed = Object.keys(transformed).map(function(key){ 
 
    var dates = transformed[key].dates, 
 
     transformedDates = Object.keys(dates).map(function(key){ 
 
      return { date : key, times : dates[key] } 
 
     }); 
 
    return { location : key, dates : transformedDates } 
 
}); 
 
results.innerHTML = JSON.stringify(secondTransformed, null, '\t');
<pre id="results"></pre>

यद्यपि यह (प्रदर्शन वार) करना बेहतर तरीके हैं।

+1

लॉग इन 'अनकॉट सिंटेक्स त्रुटि: अप्रत्याशित टोकन {'कंसोल' – guest271314

+0

पर यह विनाशकारी असाइनमेंट है, आपका ब्राउज़र अभी तक इसका समर्थन नहीं करता है। – MinusFour

+0

ठीक है, अलग-अलग ब्राउज़र – guest271314

संबंधित मुद्दे