Сравнение массивов экземпляров: возвращение уникальных элементов только второго массива - PullRequest
1 голос
/ 12 апреля 2019

Техническая информация

  • 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;

}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Обновление Даже в этом случае вы все равно можете использовать простые методы массива.

function getFlat(v) {
  return {
    val: v,
    isSameAs: function(o) {
      return this.val === o.val
    }
  }
}


var array1 = [getFlat(1), getFlat(2), getFlat(3)];
var array2 = [getFlat(2), getFlat(3), getFlat(9)];

function getJustUniqueElementsFromArray2(arr1, arr2) {
  return arr2.filter(x => arr1.filter(y => y.isSameAs(x)).length === 0);
}

console.log(getJustUniqueElementsFromArray2(array1, array2));

Если вам просто нужны уникальные элементы из arr2 и работа с примитивами, а не refs:

var arr1 = [3,5,67];
var arr2 = [43,5,167];

console.log(arr2.filter(x=> arr1.indexOf(x) === -1)) // print unique elements from arr2
0 голосов
/ 12 апреля 2019

Вы можете взять Set и отфильтровать массив.

function getUnique(left, right)  {
    var s = new Set(left);
    return right.filter(v => !s.has(v));
}
var tempFlats = ['A', 'B', 'C', 'D', 'E'],
    newFlats = ['A', 'E', 'F'],
    uniqueElements = getUnique(tempFlats, newFlats);

console.log(uniqueElements);
...