Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδιά!

Έχω δύο πίνακες. Έναν dates στον οποίο αποθηκεύονται κάποιες ημερομηνίες και έναν payments στον οποίο αποθηκεύονται ένα τίτλος, ένα ποσό και μια τιμή που αντιστοιχεί σε κάποιο κελί του dates για κάθε payment ξεχωριστά. 

Αυτό που θέλω εγώ είναι να εμφανίσω τις τιμές ανάλογα με την ημερομηνία. Ως εδώ μια χαρά. Εκεί όμως που κολλάω είναι ότι δίνω τη δυνατότητα να διαγράφεται κάποιο payment και έτσι μπορεί να φτάσει σε σημείο να μην υπάρχει αντιστοιχία date με payment και να εμφανίζεται απλά μια ημερομηνία (με βάση πάντα τον κώδικα έτσι όπως τον έχω...).

Έχω κάνει το παρακάτω:

if(dates !== "empty"){
	for(var d = 0; d < dates.length; d++){
		payments_text += "<div class='col-md-12 col-sm-12 col-xs-12 col-lg-12 spaces'><b>" + dates[d] + "</b></div>";
		for(var i = 0; i < payments.length; i++){
			if(d === payments[i][2]){
				temp_payment = payments[i][1];

				if(temp_payment.indexOf(".") > -1){
					temp_payment = temp_payment.replace('.',',');
				}

				payments_text += "<div class='col-md-12 col-sm-12 col-xs-12 col-lg-12 spaces'><button class='btn btn-danger btn-sm  remove' value='" + i + "'> - </button>  <span class='number'>" + (i + 1) + "</span>. "  + payments[i][0] + ": " + temp_payment + " " + currency + "</div>";
				p_sum += Number(payments[i][1]);
			}
		}
	}
}

Ο μόνος τρόπος που σκέφτηκα μέχρι στιγμής είναι να κάνω έναν έλεγχο αρχικά και να βλέπω αν υπάρχει έστω μία αντιστοιχία, αλλά σε αυτή την περίπτωση θα τρέχω δύο φορές το for του payments...

Έχει κανείς να προτείνει κάτι;

Δημοσ. (επεξεργασμένο)
let groupedPayments = {};

payments.map((payment) => {
	groupedPayments[payment[2]] ? groupedPayments[payment[2]].push(payment) : groupedPayments[payment[2]] = [payment];
});

και έχεις ένα γκρουπαρισμένο με ημερομηνίες object. Μετά είτε κάνεις iterate σε αυτό, είτε στο dates ελέγχονας αν υπάρχει groupedPayments[ date [ i ] ] ας πούμε

Επεξ/σία από alou
Δημοσ. (επεξεργασμένο)
Στις 17/7/2018 στις 12:11 ΠΜ, alou είπε

let groupedPayments = {};

payments.map((payment) => {
	groupedPayments[payment[2]] ? groupedPayments[payment[2]].push(payment) : groupedPayments[payment[2]] = [payment];
});

και έχεις ένα γκρουπαρισμένο με ημερομηνίες object. Μετά είτε κάνεις iterate σε αυτό, είτε στο dates ελέγχονας αν υπάρχει groupedPayments[ date [ i ] ] ας πούμε

Αν εξαιρέσεις ότι θα το κάνω με var γιατί το τρέχω σε android webview και δεν χρησιμοποιούν όλες οι εκδόσεις android το ES6 κάπου χάθηκα μέσα στη map.

1. Με το (payment) ορίζεις ότι πλέον κάθε κελί του πίνακα payments θα αποκαλείτε ως payment μέσα στη λούπα της map γιατί αν ναι μήπως θα έπρεπε να φύγει η παρένθεση;

2. Επίσης με μπερδεύει ο ternary operator... το πρώτο σκέλος δεν θα έπρεπε να είναι κάποια συνθήκη; Εγώ τώρα βλέπω αυτό groupedPayments[payment[2]]. Γενικότερα αρχικά νόμιζα πως είχα καταλάβει κάτι από τη συνθήκη, αλλά τώρα το έχασα τελείως. Μήπως σου είναι εύκολο να μου την εξηγήσεις;

Απλά να τονίσω πως το Payments[any_cell][2] δεν περιέχει ημερομηνία, αλλά τον αριθμό του κελιού στον οποίο βρίσκεται η ημερομηνία στον πίνακα dates[]. Είναι κάτι σαν δείκτης δηλαδή. 

Επεξ/σία από rafinos
Δημοσ. (επεξεργασμένο)

Τρέχοντας τον κώδικά του @alou είδα ότι κάνει ακριβώς ότι είπε (λογικό). 

Δηλαδή τα ταξινομεί με βάση την ημερομηνία (δηλαδή το κελί του πίνακα dates). Μάλιστα αν οι τιμές είναι μπερδεμένες π.χ. αν το payments[0][2] = 2, το payments[1][2] = 1 και payments[2][2] = 0 τότε το payments[2][2] θα ταξινομηθεί πρώτο και πάει λέγοντας. Βέβαια, επειδή δεν έχω καταλάβει για ποιο λόγο γίνεται αυτό μήπως θα μπορούσε κάποιος να μου το εξηγήσει;

Βασικά κάπου το χάνω στον ternary operator μόνο αυτό θέλει εξήγηση. Νομίζω ότι αυτό που με μπερδεύει είναι το else του πράγματος.

 

Επεξ/σία από rafinos
Δημοσ.

Τελικά κατάλαβα ακριβώς τι κάνει ο κώδικας του @alou (εκτός του γιατί γίνεται ταξινόμηση από την πιο παλιά ημερομηνία στην πιο καινούρια ακόμα και στην περίπτωση που προστέθηκε δαπάνη με παλιότερη ημερομηνία μετά από πιο πρόσφατη δαπάνη). 

Βέβαια, τώρα έχω άλλο πρόβλημα. Όπως εξήγησα στο πρώτο μου post δίνω τη δυνατότητα διαγραφής μια δαπάνης μόνο που αυτή γίνεται με βάση το κελί στο οποίο βρίσκεται στον πίνακα payments. Με τη μέθοδο που προτάθηκε παραπάνω δεν μπορώ να τσεκάρω ποιο ήταν το κανονικό κελί της δαπάνης με αποτέλεσμα να μην μπορώ να τη σβήσω ή να σβήνω λανθασμένη. 

var groupedPayments = {};
            var index, counter;

            payments.map((payment) => {
                groupedPayments[payment[2]] ? groupedPayments[payment[2]].push(payment) : groupedPayments[payment[2]] = [payment];
            });

            for(var i = 0; i < dates.length; i++){
                //γίνεται έλεγχος αν υπάρχει στον πίνακα groupedPayments key με την ημερομηνία που περιέχετε στο εκάστοτε κελί του dates[]
                if(groupedPayments[dates[i]]){
                    payments_text += "<div class='col-md-12 col-sm-12 col-xs-12 col-lg-12 spaces'><b>" + dates[i] + "</b></div>";
                    counter = 1;
                    for(index in groupedPayments[dates[i]]){
                        temp_payment = groupedPayments[dates[i]][index][1];

                        if(temp_payment.indexOf(".") > -1){
                            temp_payment = temp_payment.replace('.',',');
                        }

                        payments_text += "<div class='col-md-12 col-sm-12 col-xs-12 col-lg-12 spaces'><button class='btn btn-danger btn-sm  remove' value='" + edo_empene_to_keli_tou_pinaka_me_vasi_tin_for + "'> - </button>  <span class='number'>" + counter + "</span>. "  + groupedPayments[dates[i]][index][0] + ": " + temp_payment + " " + currency + "</div>";
                        p_sum += Number(groupedPayments[dates[i]][index][1]);
                        counter++;
                    }
                }
            }

Επίσης, πλέον στο κελί [2] του κάθε payment δεν βάζω τιμή κελιού, αλλά την ημερομηνία. 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...