2016-12-04 4 views
1

Ich versuche, das Array weiter unten heutiges Datum neu zu ordnen:Bestellung einen Array basierend auf aktuellem Datum

[ 
    { 
     "index": "0", 
     "day": "Monday", 
     "food": "Salad" 
    }, 
    { 
     "index": "1", 
     "day": "Friday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "2", 
     "day": "Sunday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "3", 
     "day": "Thursday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "4", 
     "day": "Tuesday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "2", 
     "day": "Sunday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "5", 
     "day": "Wednesday", 
     "food": "Pasta" 
    }, 
    { 
     "index": "6", 
     "day": "Saturday", 
     "food": "Pasta" 
    } 
] 

Say heute Saturday, nach der Bestellung, die erwartete Ausgabe von Elementindex ist: 6, 2 , 2, 0, 4, 5, 3, 1 Wenn heute Tuesday war, durch den Index der Ausgang: 4, 5, 3, 1, 6, 2, 2, 0

I moment.js benutzen und so Bis jetzt habe ich noch keinen sperrigen Code dafür erstellt. Schließlich möchte ich den Code in einen benutzerdefinierten Befehl OrderBy wickeln, der für eine ng-repeat-Direktive verwendet werden soll.

+0

Warum erscheint 'Sunday' zweimal? –

+0

@miparnisari Nur um zu veranschaulichen, dass Objekte im Array dupliziert werden können. – user1027620

+0

können Sie uns zeigen, welchen Code Sie bisher verwendet haben? – anurupr

Antwort

2

Hier ist die Minimallösung kam ich mit:

const DAYS = { 'Sunday': 0, 'Monday': 1, 'Tuesday': 2, 'Wednesday': 3, 'Thursday': 4, 'Friday': 5, 'Saturday': 6 }; 

// Get the relative index of a day using today as a reference. 
function relativeIndex(day) { 
    const TODAY = new Date().getDay(); 
    return (DAYS[day] - TODAY + 7) % 7; 
} 

// Sort a lit of data starting by today. 
function sort(data) { 
    return data.sort((a, b) => relativeIndex(a.day) - relativeIndex(b.day)); 
} 

Der Schlüssel hier ist die relativeIndex Funktion, die den Index jeden Tag als Referenz heute mit berechnet.

+0

deshalb bin ich hier. Gute Antwort! – synthet1c

1

Sortierung bis heute war ein wenig schwierig zu erreichen, nur mit sort. Um dies zu überwinden, erstellen wir ein Array von Tagen, dann greifen wir darauf zurück, so dass der aktuelle Tag bei Index 0 liegt, und sortiert dann Ihr Kalender-Array basierend auf den sortierten Tagen.

um zu vermeiden, die sortedDays mehrmals zu berechnen, ist es in eine Schließung eingewickelt, die die Funktion zurückgibt, die das angegebene Array sortiert.

Es ist unveränderlich, so dass Sie die ursprüngliche Reihenfolge nicht ändern müssen, wenn Sie nicht müssen.

const calendar=[{index:"0",day:"Monday",food:"Salad"},{index:"1",day:"Friday",food:"Pasta"},{index:"2",day:"Sunday",food:"Pasta"},{index:"3",day:"Thursday",food:"Pasta"},{index:"4",day:"Tuesday",food:"Pasta"},{index:"2",day:"Sunday",food:"Pasta"},{index:"5",day:"Wednesday",food:"Pasta"},{index:"6",day:"Saturday",food:"Pasta"}]; 
 

 
const sortByToday = (function() { 
 
    
 
    const date = new Date() 
 
    const today = date.getDay() 
 
    
 
    const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 
 

 
    const sortedDays = [ 
 
    ...days.slice(today), 
 
    ...days.slice(0, today) 
 
    ] 
 
    
 
    return function(calendar) { 
 
    return calendar.slice().sort((a, b) => { 
 
     return sortedDays.indexOf(a.day) > sortedDays.indexOf(b.day) 
 
    }) 
 
    } 
 
})() 
 

 
console.log(
 
    sortByToday(calendar) 
 
)

0

Gegeben 'Menü' als gegeben Array, den individuellen Einsatz Vergleich zu sortieren:

var map = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
var day = (new Date()).getDay(); 
menu.sort(function(a, b){ 
    var aDay = map.indexOf(a.day), bDay = map.indexOf(b.day); 
    return (aDay - bDay) * 
     (day <= Math.min(aDay, bDay) || day > Math.max(aDay, bDay) ? 1 : -1); 
}); 

for(var i=0; i<menu.length; ++i){ 
    console.log(menu[i].index); 
} 
0

Mit Date() Gymnastik. Scrollen Sie nach unten, um den kommentierten Code zu sehen.

let arr = [ 
 
    { 
 
     "index": "0", 
 
     "day": "Monday", 
 
     "food": "Salad" 
 
    }, 
 
    { 
 
     "index": "1", 
 
     "day": "Friday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "2", 
 
     "day": "Sunday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "3", 
 
     "day": "Thursday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "4", 
 
     "day": "Tuesday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "2", 
 
     "day": "Sunday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "5", 
 
     "day": "Wednesday", 
 
     "food": "Pasta" 
 
    }, 
 
    { 
 
     "index": "6", 
 
     "day": "Saturday", 
 
     "food": "Pasta" 
 
    } 
 
] 
 

 
// first create an array to label days 
 
let dayOfWeekLabels = [ 
 
    'Sunday', 
 
    'Monday', 
 
    'Tuesday', 
 
    'Wednesday', 
 
    'Thursday', 
 
    'Friday', 
 
    'Saturday' 
 
]; 
 

 
let days = []; 
 
let runningDate = new Date(); 
 

 
// optional offset for debugging/testing 
 
//runningDate.setDate(runningDate.getDate()+1); 
 

 
// now create an array that rearranges the first array 
 
// according to what day it is today 
 
dayOfWeekLabels.forEach((label,i) => { 
 
    days.push(dayOfWeekLabels[new Date(runningDate).getDay()]); 
 
    runningDate.setDate(runningDate.getDate()+1); 
 
}); 
 

 
// now enhance the original array with an "order" value 
 
let orderedArr = arr.map(obj => { 
 
    obj.order = days.indexOf(obj.day); 
 
    return obj; 
 
}); 
 

 
// now sort based on the "order" value 
 
orderedArr.sort((a,b) => { 
 
    return (a.order - b.order); 
 
}); 
 
/* 
 
console.log(orderedArr); 
 
*/ 
 
document.getElementById('output').innerHTML = JSON.stringify(orderedArr,null," ");
<pre><code class="json" id="output"></code></pre>

Verwandte Themen