Техническая информация
- 2 массива
- оба содержат экземпляры одного класса
- Массивы могут быть различной длины
- В классе есть функция isSameAs ()
Вопрос
Как я могу сравнить элементы из этих двух массивов и вернуть только уникальные элементы второго массива?
Фон
Я хочу сканировать квартиры из Интернета и иметь временный массив, который затем будет проверяться на наличие новых сканированных квартир. После этого временный массив становится массивом только что просканированных квартир.
Поэтому, если новых квартир нет, временный массив также может быть пустым.
Мой подход
Сначала я проверю, какой массив длиннее. Затем у меня есть вложенный цикл, начинающийся с более длинного массива, чтобы проверить каждый элемент относительно более короткого массива. Я тогда застрял представить все возможные условия и не знаю, как это пометить.
function getJustUniqueElementsFromArray2(array1, array2){
let uniqueElements = [];
/* Checks which array is longer */
let longerArray;
let shorterArray;
if (array2.length >= array1.length) {
longerArray = array2;
shorterArray = array1;
} else {
longerArray = array1;
shorterArray = array2;
}
/* Nested for loop starting with longer array */
for (let longerElem of longerArray) {
for (let shorterElem of shorterArray) {
//????
if (!longerElem.isSameAs(shorterElem)) {
uniqueElements.push(shorterElem);
} else if (!shorterElem.isSameAs(longerElem)) {
uniqueElements.push(longerElem);
}
//????
}
}
return uniqueElements;
}
Init Crawl
let tempFlats = [];
let newFlats = [A, B, C];
uniqueElements = [A, B, C];
tempFlats = newFlats;
2. Crawl
//now: tempFlats = [A, B, C];
newFlats = [A, B, C, D, E];
uniqueElements = [D, E];
tempFlats = newFlats;
3. Crawl
//now: tempFlats = [A, B, C, D, E];
newFlats = [A, E, F];
uniqueElements = [F];
tempFlats = newFlats;
4. Crawl
//now: tempFlats = [A, E, F];
newFlats = [A, B, G, H];
uniqueElements = [B, G, H];
tempFlats = newFlats;
5. Crawl
//now: tempFlats = [A, B, G, H];
newFlats = [];
uniqueElements = [];
tempFlats = newFlats;
EDIT
Я забыл упомянуть, что экземпляры в массивах технически не совпадают.
tempFlats = [A1, B1, C1];
newFlats = [A2, B2, C2, D1, E1];
A1 == A2 // false
A1.isSameAs(A2) // true
Решение
function getJustUniqueElementsFromArray2(array1, array2){
let uniqueElements = [];
/* Nested for loop starting with longer array */
for (let elem2 of array2) {
let found = false;
for (let elem1 of array1) {
if (elem2.isSameAs(elem1)) {
found = true;
}
}
if (!found) uniqueElements.push(elem2)
}
return uniqueElements;
}