实例的数组比较:仅返回第二个数组的唯一元素

时间:2019-04-12 08:46:19

标签: javascript arrays comparison instance

技术信息

  • 2个数组
  • 都包含一个类的实例
  • 数组的长度可以不同
  • 该类具有isSameAs()函数

问题

我如何比较这两个数组中的元素并仅返回第二个数组的唯一元素?

背景

我想从网上抓取单位并有一个临时数组,然后将其与新抓取的单位进行比较。此后,临时阵列将成为刚刚爬网的单位阵列。 因此,如果没有新单位,则临时数组也可以为空。

我的方法

我首先检查哪个数组更长。然后,我有一个嵌套的for循环,以较长的数组开头,以针对较短的数组检查每个元素。然后,我被困在想象所有可能的条件,并且不知道如何举报。

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;

}

初始化抓取

let tempFlats = [];
let newFlats = [A, B, C];
uniqueElements = [A, B, C];
tempFlats = newFlats;

2。爬网

//now: tempFlats = [A, B, C];
newFlats = [A, B, C, D, E];
uniqueElements = [D, E];
tempFlats = newFlats;

3。爬网

//now: tempFlats = [A, B, C, D, E];
newFlats = [A, E, F];
uniqueElements = [F];
tempFlats = newFlats;

4。爬网

//now: tempFlats = [A, E, F];
newFlats = [A, B, G, H];
uniqueElements = [B, G, H];
tempFlats = newFlats;

5。爬网

//now: tempFlats = [A, B, G, H];
newFlats = [];
uniqueElements = [];
tempFlats = newFlats;

编辑

我忘了提到数组中的实例在技术上是不一样的。

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 :(得分:0)

您可以使用Set并过滤数组。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" class="form-control input-td" name="getmark[]" id="getMark_<?php echo $i++?>"  required>
 <input type="text" class="form-control input-td" name="mcq[]" id="mcq_<?php echo $i++?>" required>

答案 1 :(得分:0)

更新 即使在那种情况下,您仍然可以摆脱简单的数组方法。

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