2016-06-24 24 views
0

Angenommen, ich habe eine Liste von Tagen, die der Benutzer auswählen kann (sie können mehrere auswählen).Abrufen einer Tagesbereichszeichenfolge basierend auf dem ausgewählten Tag

Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag. Jedem ist eine Nummer zugeordnet (0-6). 0 ist Sonntag und 6 ist Samstag: „- Dienstag Sonntag“

vm.weekDays = [ 
     {name: 'Sunday', number: 0}, 
     {name: 'Monday', number: 1}, 
     {name: 'Tuesday', number: 2}, 
     {name: 'Wednesday', number: 3}, 
     {name: 'Thursday', number: 4}, 
     {name: 'Friday', number: 5}, 
     {name: 'Saturday', number: 6}, 
    ] 

Angenommen, der Benutzer wählt Sonntag, Montag, Dienstag, sollten wir den String bekommen. Wenn der Benutzer jedoch Sonntag, Montag, Dienstag, Donnerstag auswählt, sollten wir die Zeichenfolge "Sonntag - Dienstag, Donnerstag" erhalten. Und wenn der Benutzer Sonntag, Dienstag, Donnerstag auswählt, sollten sie genau das sehen.

Derzeit speichere ich die Zeichenfolgen in einem Array. Dann werde ich das verwenden, um die Zeichenfolgen anzuzeigen.

Hier ist, was ich bisher:

function test() { 

     vm.display = []; 

     var test = _.sortBy(vm.sWeekDays, 'number'); 

     var start = 0; 
     var end = 0; 
     if(test.length > 1){ 
      for(var i=0; i <= test.length-2; i++){ 
       if(test[i].number+1 != test[i+1].number) { 
        start = i + 1; 
        end = i; 
        vm.display.push(test[i].name); 
       } 
       end = i+1; 
      } 
      vm.display.push(test[start].name + " - " + test[end].name); 
     } else { 
      vm.display.push(test[0].name); 
     } 
    } 

Derzeit ich die aufeinander folgenden Tage bekommen zu zeigen, aber wenn ich von Sonntag bis Dienstag und Donnerstag wähle es nicht korrekt angezeigt werden.

Jede Hilfe wird sehr geschätzt.

Antwort

0

Ich habe Ihren Code ein wenig bearbeitet, aber ich hoffe, die Antwort ist klar. Hier ist meine Implementierung

var vm = {}; 
vm.weekDays = [{ 
    name: 'Sunday', 
    number: 0 
}, { 
    name: 'Monday', 
    number: 1 
}, { 
    name: 'Tuesday', 
    number: 2 
}, { 
    name: 'Wednesday', 
    number: 3 
}, { 
    name: 'Thursday', 
    number: 4 
}, { 
    name: 'Friday', 
    number: 5 
}, { 
    name: 'Saturday', 
    number: 6 
}, ] 

function formatSelected(selected) { 
    vm.display = []; 
    selected = _.sortBy(selected, 'number'); //this could be vm.selected instead of passing it as a parameter 

    var lastnumber = 0, 
     template = { 
      name: '', 
      number: 0 
     }, 
     last, 
     list = []; 

    if (selected.length > 0) { 
     last = selected[0]; 
     for (var i = 0; i < selected.length; i++) { 
      if (last) { 
       var left = selected[i - 1] ? selected[i - 1] : angular.copy(template); 
       console.log(selected[i].number - left.number) 

       if (i > 0 && selected[i].number - left.number > 1) { 
        list.push(((left.name != last.name) ? (last.name + '-') : '') + left.name); 
        last = selected[i]; 
       } 
       if((i == (selected.length - 1))) { 
        list.push(((selected[i].name != last.name) ? (last.name + '-') : '') + selected[i].name); 
       } 
      } else { 
       last = selected[i]; 
      } 
     } 
    } 

    vm.display = list; 
}; 

Dann Sie die Funktion mit einem Array nennen könnte

formatSelected([{ 
    name: 'Sunday', 
    number: 0 
}, { 
    name: 'Monday', 
    number: 1 
}, { 
    name: 'Tuesday', 
    number: 2 
}, { 
    name: 'Wednesday', 
    number: 3 
}, { 
    name: 'Saturday', 
    number: 6 
}, ]); 

Ich bearbeitete die Lösung zu behandeln Array wie:

formatSelected([{ name: 'Sunday', number: 0}, { name: 'Tuesday', number: 2}, { name: 'Thursday', number: 4}]); 
+0

Wenn der Eingang '[{name: 'Sonntag', Anzahl: 0}, {name: 'Dienstag', Anzahl: 2}, {name: 'Donnerstag', Nummer: 4}] ', drei diskontinuierliche Tage, das Ergebnis ist nicht korrekt ... –

+0

Fixed, Haizhou Liu. Vielen Dank für Ihre Hilfe. –

+0

Vielen Dank für Ihre Hilfe, ich habe versucht, es zu tun und es hat funktioniert. – ImmortalBajan

0

Wir eine Karte speichern können der Bereich, und dann pares wir die Karte zu Ergebniszeichenfolge.

// The map structure 
[ 
    [{ 
     name: 'Sun', 
     number: 0 
    }, { 
     name: 'Mon', 
     number: 1 
    }, { 
     name: 'Tue', 
     number: 2 
    }], 
    [{ 
     name: 'Thu', 
     number: 4 
    }] 
] 

Danach prüfen wir jeden Bereich, ob es zu 'day1 - day3' oder 'day1, day2' umwandeln muss.

Bitte überprüfen Sie diese JSFiddle

+0

In den kommenden Tagen werde ich versuchen, die Aufgabe zu erfüllen und Sie auf dem Laufenden zu halten. – ImmortalBajan