Emptying array when it matches another array

时间:2015-09-01 21:59:46

标签: javascript arrays

So, I'm trying to match 2 different arrays. If the same cells match, I want to remove that cell from one array using the .slice method.

Edit: What I'm trying to do is remove a number from array1 if array2 contains a matching number. The way the code works now is that it only deletes 1 entry. I want all the entries deleted from the first array.

array1 = [1, 2, 4, 5, 7, 10];
array2 = [1,2,4,5,6,7,8];

var misc = function deleteValues(array, arayy) {
  for(var i = 0; i < array.length; i++) {
    if ( arayy[i] == array[i]) {
      array.splice(i, 1);
    }
  }
  return array;
};

I try to run this and under console log, the array1 is unchanged. It seems like the splice method isn't removing any cells. I searched SE, but couldn't find anything that could help me.

2 个答案:

答案 0 :(得分:3)

jsFiddle Demo

The problem is that you are modifying one of the arrays as you iterate, but you are still using the same index. The end result is that you end up comparing the wrong indexes to each other after the first removal. Use two indexes, have one offset back down when it removes an item, and have the other simply iterate.

var misc = function deleteValues(array, arayy) {
    for(var i = 0, j = 0; i < array.length; i++, j++) {
        if ( arayy[j] == array[i]) {
            array.splice(i--, 1);
        }
    }
    return array;
};

答案 1 :(得分:1)

It seems you want to remove items from the first array if the values are also in the second. The reduceRight method seems suitable as it iterates from right to left over the array, hence removing items doesn't affect the index of subsequent elements in the array. The same result can be achieved with a decrementing loop.

Also, I think function declarations are better than assignment of expressions, but each to their own.

var array1 = [1, 2, 4, 5, 7, 10];
var array2 = [1,2,4,5,6,7,8];

function deleteValues(arr0, arr1) {
  arr0.reduceRight(function(x, value, index) {
    if (arr1.indexOf(value) != -1) {
      arr0.splice(index, 1);
    }
  },'');

  // Not necessary but handy for chaining
  return arr0;
}

document.write(deleteValues(array1, array2));

Using an arrow function, the above can be reduced to:

function deleteValues(arr0, arr1) {
  arr0.reduceRight((x, v, i) => arr1.indexOf(v) != -1? arr0.splice(i, 1):'');
  return arr0;
}