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

Javascript σύγκριση δισδιάστατων πινάκων


rafinos
Μετάβαση στην απάντηση Απαντήθηκε από tsofras,

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

Δημοσ. (επεξεργασμένο)

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

έχω δύο πίνακες της μορφής:

array1 = [
	["test",12345],
	["test2",14345],
	["test3",18645],
	.
	.
	.	
]

array2 = [
	["test",16875],
	["test2",13455],
	["test3",16555],
	.
	.
	.	
]

Πως μπορώ να συγκρίνω τους δύο πίνακες και να εξάγω έναν τρίτο με βάση το κελί [0] παραβλέποντας τον ακέραιο αριθμό κατά την σύγκριση;

Αν αυτό είναι κάπως δύσκολο, οι πίνακες πριν γίνουν αυτής της μορφής περιέχουν string της μορφής "test,12345" και τα κάνω split. Αν μπορεί να γίνει έλεγχος για το αν υπάρχουν κοινά substrings και να μετατρέψω το τελικό αποτέλεσμα σε δισδιάστατο πίνακα δεν υπάρχει πρόβλημα. Ο τελικός πίνακας είναι αυτός που με ενδιαφέρει.

Επεξ/σία από rafinos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υπάρχουν πολλοί τρόποι να κάνεις το παραπάνω αλλά πες μας πρώτα τα παρακάτω:

1) Σε τι μορφή θες τον τελικό πίνακα. Π.χ έτσι;

const diff = [
 "test1",
 "test3"
];

2) Αυτό θα τρέχει συχνά γιατί θα πρέπει να κάνεις κάποια array manipulations για να φτάσεις στο επιθυμητό αποτέλεσμα και ίσως αξίζει να προσπαθήσεις να δημιουργήσεις τα αρχικά array σε μια μορφή που θα σε βολέψει.

3) Έχει σημασία η σειρά των string στον πίνακα; Δλδ αν το "test" του array1 είναι στην 2η θέση του array2 το θεωρείς διαφορετικό ή όχι;

4) Τα 2 array θα έχουν το ίδιο μήκος πάντα;

Ορίστε μια υλοποίηση που θεωρεί πως τα array έχουν το ίδιο μήκος χωρίς να είναι sorted.

const array1 = [
	["test",12345],
	["test2",14345],
	["test4",18645],
];

const array2 = [
	["test",16875],
	["test2",13455],
	["test3",16555],
];

const array2Mapped = array2.map(([str]) => str);

const diffs = array1.reduce((acc, [str, val]) => {
  if(!array2Mapped.includes(str)){
		acc.push(str)
  }
  return acc;
}, []);

console.log(diffs); // ["test4"]
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1) Ο τελικός πίνακας θέλω να είναι της ίδιας μορφής με τους αρχικούς (θέλω να περιλαμβάνεται και το timestamp) 

2) Οι πίνακες δημιουργούνται που αντλούνται από αρχείο μορφής json και απλά απομονώνω τα στοιχεία που με ενδιαφέρουν. 

3) Δεν έχει καμία σχέση η θέση των τιμών στον πίνακα. 

4) Τα δυο arrays δεν έχουν ίδιο μέγεθος. Αυτό που ενδιαφέρει είναι να εξάγω σε άλλο array τις τιμές του δεύτερου array που δεν υπάρχουν στο πρώτο με βάση την τιμή του string. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

const array1 = [
  ["test3", 14345],
  ["test2", 14345],
  ["test4", 18645],
];

const array2 = [
  ["test2", 13455],
  ["test", 16875],
  ["test4", 16555],
  ["test", 16555],
];

// Extract only the strings from array1 and array 2
const array1Mapped = array1.map(([str]) => str);
const array2Mapped = array2.map(([str]) => str);

// Find the differences between array1 and array2
const diffs1 = array1.reduce((acc, [str, val]) => {
  if (!array2Mapped.includes(str)) {
    acc.push([str, val])
  }
  return acc;
}, []);

// Find the differences between array2 and array1
const diffs2 = array2.reduce((acc, [str, val]) => {
  if (!array1Mapped.includes(str)) {
    acc.push([str, val])
  }
  return acc;
}, []);

// Merge the differences found in both arrays
const diff = [...diffs1, ...diffs2];

// Create an object to store unique nested arrays based on the first element (string)
const uniqueValuesObj = diff.reduce((acc, curr) => {
  acc[curr[0]] = curr;
  return acc;
}, {});

// Extract unique nested arrays from the object
const uniqueValues = Object.values(uniqueValuesObj);

// Print the unique nested arrays
console.log(uniqueValues);

Επειδή δεν έχουν κοινό μήκος τα arrays θα πρέπει να τα προσπελάσεις και τα 2 και μετά να αφαιρέσεις τα duplicates.
Αρκετά μπακάλικος τρόπος βέβαια, είμαι σίγουρος πως θα μπορεί να γίνει και με λιγότερα iterations.

https://jsfiddle.net/thanosdi/tdczgwnu/
 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

56 λεπτά πριν, Xvipes είπε
const array1 = [
  ["test3", 14345],
  ["test2", 14345],
  ["test4", 18645],
];

const array2 = [
  ["test2", 13455],
  ["test", 16875],
  ["test4", 16555],
  ["test", 16555],
];

// Extract only the strings from array1 and array 2
const array1Mapped = array1.map(([str]) => str);
const array2Mapped = array2.map(([str]) => str);

// Find the differences between array1 and array2
const diffs1 = array1.reduce((acc, [str, val]) => {
  if (!array2Mapped.includes(str)) {
    acc.push([str, val])
  }
  return acc;
}, []);

// Find the differences between array2 and array1
const diffs2 = array2.reduce((acc, [str, val]) => {
  if (!array1Mapped.includes(str)) {
    acc.push([str, val])
  }
  return acc;
}, []);

// Merge the differences found in both arrays
const diff = [...diffs1, ...diffs2];

// Create an object to store unique nested arrays based on the first element (string)
const uniqueValuesObj = diff.reduce((acc, curr) => {
  acc[curr[0]] = curr;
  return acc;
}, {});

// Extract unique nested arrays from the object
const uniqueValues = Object.values(uniqueValuesObj);

// Print the unique nested arrays
console.log(uniqueValues);

Επειδή δεν έχουν κοινό μήκος τα arrays θα πρέπει να τα προσπελάσεις και τα 2 και μετά να αφαιρέσεις τα duplicates.
Αρκετά μπακάλικος τρόπος βέβαια, είμαι σίγουρος πως θα μπορεί να γίνει και με λιγότερα iterations.

https://jsfiddle.net/thanosdi/tdczgwnu/
 

Πρακτικά το diffs1 δεν το χρειάζομαι καν νομίζω. Εμένα με ενδιαφέρει να πάρω μόνο όσα δεν υπάρχουν στον πρώτο πίνακα, αλλά περιέχονται στον δεύτερο. 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Λύση
31 λεπτά πριν, rafinos είπε

Πρακτικά το diffs1 δεν το χρειάζομαι καν νομίζω. Εμένα με ενδιαφέρει να πάρω μόνο όσα δεν υπάρχουν στον πρώτο πίνακα, αλλά περιέχονται στον δεύτερο. 

Ας είναι και duplicates ?

const uniqueArray2 = array2.filter(([key2]) => !array1.some(([key1]) => key1 === key2));

console.log(uniqueArray2);

 

Αν θες να φιλτράρεις και τα dublicates του array2

// Get unique elements from array2 that do not exist in array1
const uniqueArray2 = array2
  .filter(([key2]) => !array1.some(([key1]) => key1 === key2)) // Filter out elements not in array1
  .filter((value, index, self) => self.findIndex(([key]) => key === value[0]) === index); // Filter out duplicates

console.log(uniqueArray2);

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Τι εννοείς με το duplicates; Αφού θα υπάρχουν μόνο στο δεύτερο array πως μπορούν να είναι duplicates; Εννοείς να υπάρχουν δυο φορές στο ίδιο array; Αν ναι αυτό δεν μπορεί να συμβεί. Οι τιμές του είναι όλες μοναδικές.

@tsofras δεν γνώριζα την some. Ουσιαστικά ακόμα και αν στοιχείο του πίνακα περιέχετε σε άλλον πίνακα επιστρέφει true; Και μιας που κάθε element είναι ένας υποπίνακας μας κάνει την δουλειά. 

Νομίζω ότι αυτό είναι που ήθελα!

@Xvipes και η δική σου λύση νομίζω ότι λειτουργεί απλά είναι πιο μπελαλίδικη όπως είπες και ο ίδιος. 

Σας Ευχαριστώ! 

Επεξ/σία από rafinos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

49 λεπτά πριν, rafinos είπε

Τι εννοείς με το duplicates; Αφού θα υπάρχουν μόνο στο δεύτερο array πως μπορούν να είναι duplicates; Εννοείς να υπάρχουν δυο φορές στο ίδιο array; Αν ναι αυτό δεν μπορεί να συμβεί. Οι τιμές του είναι όλες μοναδικές.

@tsofras δεν γνώριζα την some. Ουσιαστικά ακόμα και αν στοιχείο του πίνακα περιέχετε σε άλλον πίνακα επιστρέφει true; Και μιας που κάθε element είναι ένας υποπίνακας μας κάνει την δουλειά. 

Νομίζω ότι αυτό είναι που ήθελα!

@Xvipes και η δική σου λύση νομίζω ότι λειτουργεί απλά είναι πιο μπελαλίδικη όπως είπες και ο ίδιος. 

Σας Ευχαριστώ! 

Ναι εννοούσα αν έχει διπλές εγγραφές στο 2ο array (όπως είχε στα dummy data o @Xvipes )

https://www.w3schools.com/jsref/jsref_some.asp

Αναφορά σε κείμενο

The some() method checks if any array elements pass a test (provided as a callback function).

The some() method executes the callback function once for each array element.

The some() method returns true (and stops) if the function returns true for one of the array elements.

The some() method returns false if the function returns false for all of the array elements.

The some() method does not execute the function for empty array elements.

The some() method does not change the original array.

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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