簡體   English   中英

區分數組(不修改原始數組)

[英]Diff an Array (without modifying original arrays)

目的

我試圖強調兩個數組之間的區別。 請注意,arr1和arr2的長度會有所不同,並且存在多種類型(字符串和數字)。

我的密碼

function diff(arr1, arr2) {
  var diffArr = [];

  if (arr1.length >= arr2.length) {
    for (var i = 0; i < arr1.length; i++){
      if (arr2.indexOf(arr1[i]) < 0) {
          diffArr.push(arr1[i]);
          }
    }
  } else {
    for (var j = 0; j < arr2.length; j++){
      if (arr1.indexOf(arr2[j]) < 0) {
        diffArr.push(arr2[j]);
      }
    }
  }
  return diffArr;
}

問題

diff([1, 2, 'cat', 'fish'], [1, 2, 3,'dog']); //returns only ['cat', 'fish']

我很確定我的代碼僅通過diffArr.push返回一個數組中的重復項(即使兩個數組中都有唯一的值)。 但是,我不確定該如何克服。

我的參考

從Javascript數組中刪除重復項

快速從陣列中刪除重復項

JavaScript數組差異

您的代碼當前僅爬網一個數組(我們稱其為A),並推入B中不存在的所有A值。您永遠不會用另一種方式推入A中不存在的B值。也不需要基於哪個數組更長而具有不同的行為。 這是簡單的最終答案:

function diff(arr1, arr2) {
  var diffArr = [];
  for (var i = 0; i < arr1.length; i++) {
    if (arr2.indexOf(arr1[i]) < 0) diffArr.push(arr1[i]);
  }
  for (var j = 0; j < arr2.length; j++) {
    if (arr1.indexOf(arr2[j]) < 0) diffArr.push(arr2[j]);
  }
  return diffArr;
}

並以更實用的方式:

function diff(arr1, arr2) {
  var elsIn1Not2 = arr1.filter(function(el){ return arr2.indexOf(el) < 0; });
  var elsIn2Not1 = arr2.filter(function(el){ return arr1.indexOf(el) < 0; });
  return elsIn1Not2.concat(elsIn2Not1);
}

對於您的示例[ 'cat', 'fish', 3, 'dog' ]這兩個函數均返回[ 'cat', 'fish', 3, 'dog' ]

function diff(arr1, arr2) {
  var diffArr = {};

  if (arr1.length >= arr2.length) {
    for (var i = 0; i < arr1.length; i++){
      if (arr2.indexOf(arr1[i]) < 0) {
          diffArr[arr1[i]] = 1;
          }
    }
  } else {
    for (var j = 0; j < arr2.length; j++){
      if (arr1.indexOf(arr2[j]) < 0) {
        diffArr[arr2[j]] = 2;
      }
    }
  }
  return diffArr.keys();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM