比较两个不同长度的数组并使用不常见的元素返回一个数组

时间:2017-02-22 06:20:40

标签: javascript arrays slice

这里,我有两个不同长度的数组。一个数组将返回两个数组中不常见的值。但编译器输出错误。这些功能有哪些问题? 输出:[4,5]在这种情况下,而不是[4]。

function diffArray(arr1, arr2) {
  var newArr = [];
  var y=[];
  var z=[];
  // Same, same; but different.
  var flag=0;
  for(var i=0;i<arr1.length;i++){
    if(arr2.indexOf(arr1[i]===-1)){
      z=arr1.slice(i,i+1);
      //return z;
    }
    for(var j=0;j<arr2.length;j++){
      if(arr1.indexOf(arr2[j])===-1){
        y=arr2.slice(j,j+1);
        //z=arr1.slice(i,i+1);
        //break;
      }
    }
  }
   return newArr.concat(y,z);
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]);

9 个答案:

答案 0 :(得分:1)

尝试以下方法:

function diffArray (arr1, arr2) {
    var z = arr1.filter(function (value) { return !~arr2.indexOf(value); });
    var y = arr2.filter(function (value) { return !~arr1.indexOf(value); });

    return [].concat(y, z);
}

答案 1 :(得分:1)

您可以尝试替代您的功能

a1 = [1, 2, 3, 5];
a2 = [1, 2, 3, 4, 5];
result = [];
if (a1.length > a2.length) {
  temp = a1;
  a1 = a2;
  a2 = temp;
}

$.grep(a2, function(k) {
        if ($.inArray(k, a1) == -1) result.push(k);
});
console.log(result);,

这两个数组的工作都是jsfiddle

试一试,这样可行。

答案 2 :(得分:1)

在您的代码中,您有以下行:

z=arr1.slice(i,i+1);
y=arr2.slice(j,j+1);

如果这样做,每次获得一个独特元素时,您将丢失之前存储的元素。

此外,Array.prototype.slice会返回一个数组,因此您也不需要使用slice()

function diffArray(arr1, arr2) {
  var newArr = [];
  var y=[];
  var z=[];

  var flag=0;
  for(var i=0;i<arr1.length;i++) {
    if(arr2.indexOf(arr1[i])===-1) {
      z.push(arr1[i]);
    }
  }

  for(var j=0;j<arr2.length;j++) {
    if(arr1.indexOf(arr2[j])===-1) {
      y.push(arr2[j]);
    }
  }

  return y.concat(z);
}

这应该可以帮助你。

这是一个显示相同的fiddle

答案 3 :(得分:1)

function diffArray(arr1, arr2) {
  var newArr = [];

  var firstArray = arr1;
  var secondArray = arr2;
  if (arr2.length > arr1.length) {
    firstArray = arr2;
    secondArray = arr1;
  }

  var isNotMatched = false;

  for (var i in firstArray) {
    for (var j in secondArray) {
      if (firstArray[i] !== secondArray[j]) {
        isNotMatched = true;
      } else {
        isNotMatched = false;
        break;
      }

    }

    if (isNotMatched)
      newArr.push(firstArray[i]);

  }

  return newArr;
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

第二版适用于所有

function diffArray(arr1, arr2) {
  var newArr = [];
  var firstArray = arr1;
  var secondArray = arr2;
  if (arr2.length > arr1.length) {
    firstArray = arr2;
    secondArray = arr1;
  }

  var whenSameLegth = '';
  var isNotMatched = false;

  for (var i in firstArray) {
    for (var j in secondArray) {
      if (firstArray[i] !== secondArray[j]) {
        isNotMatched = true;
        whenSameLegth = secondArray[j];
      } else {
        isNotMatched = false;
        break;
      }

    }
    if (isNotMatched && arr2.length === arr1.length) {
      newArr.push(firstArray[i]);
      newArr.push(whenSameLegth);
    } else if (isNotMatched) {
      newArr.push(firstArray[i]);
    }
  }

  return newArr;
}

diffArray([“andesite”,“grass”,“dirt”,“pink wool”,“dead krub”],[“diorite”,“andesite”,“grass”,“dirt”,“dead krub” ]);

答案 4 :(得分:0)

编写的代码最多只能返回两个项目,因为只要y或{{1},zz=arr1.slice(i,i+1);都会被一个长度为1的新数组覆盖} 叫做。您可能想使用Array.push,即y=arr2.slice(j,j+1);z.push(arr1[i]);。每次找到一个元素时,这将添加到同一个数组,而不是每次都重置结果数组。

答案 5 :(得分:0)

您可以合并数组并返回唯一值。

&#13;
&#13;
function diffArray(a1, a2){
  var data = a1.concat(a2);
  return data.filter(function(item, i, a){
    return a.indexOf(item) === a.lastIndexOf(item)
  });
}

console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
console.log(diffArray([1, 2, 3, 5], [11, 12, 13, 14, 5]));
&#13;
&#13;
&#13;

答案 6 :(得分:0)

试试这个

var newArr = [];
    function diffArray(arr1, arr2) {


            arr1.forEach(function (item) {
                if (arr2.indexOf(item) === -1)
                    newArr.push(item);
            });

            arr2.forEach(function (item) {
                if (arr1.indexOf(item) === -1)
                    newArr.push(item);
            });

    }

    diffArray(["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]);

答案 7 :(得分:0)

如果您可以使用最新版本的JavaScript(ES6),则以下操作应该以线性时间运行,而不是二次时间 - O(N)与O(N²)。

function diffArray(a, b) {
  a = new Set(a)
  let result = []
  for (let value of b) {
    a.delete(value) || result.push(value)
  }
  result.push(...a)
  return result
}

console.log(diffArray(
  [1, 2, 3, 5],
  [1, 2, 3, 4, 5]
))
console.log(diffArray(
  ["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"],
  ["diorite", "andesite", "grass", "dirt", "dead shrub"]
))

答案 8 :(得分:0)

您可以使用哈希表并计算出现次数。它也适用于数组中的多个equla元素。

&#13;
&#13;
function getSymmetricDifference(a1, a2) {
    var hash = {};
    a1.forEach(function (a) {
        (hash[a] = hash[a] || { count: 0, value: a }).count++;
    });
    a2.forEach(function (a) {
        (hash[a] = hash[a] || { count: 0, value: a }).count--;
    });
    return Object.keys(hash).filter(function (a) { return hash[a].count; }).map(function (a) { return hash[a].value; });
}

console.log(getSymmetricDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));
console.log(getSymmetricDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]));
&#13;
&#13;
&#13;