Разница двух 2D массивов - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать функцию, чтобы получить разницу между двумя двумерными массивами, но я обнаружил, что для работы function removeArray() необходимо использовать разные переменные счетчика в обеих функциях.Если в обоих случаях взято i, цикл повторяется только один раз, тогда как цикл должен повторяться дважды.

function removeArray(toremove, myarray){
      for(i=0; i< toremove.length ; i++){
          // console.log(getIndex(toremove[i],myarray));
          myarray.splice(getIndex(toremove[i],myarray),1);
          console.log("" + myarray); //only [2,3] will get remove
        }
    }
    
function getIndex(array, myarray){
      for(i=0;i< myarray.length ; i++){
          // if(typeof(array)== 'undefined'){console.log("error"); return 100;}
          if((myarray[i][0] == array[0]) && (myarray[i][1] == array[1])){
          return i;
          }
        }
    }
    var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
    var toremove=[[2,3],[3,3]];
    
    removeArray(toremove,myarray);

Также, когда закомментированные части включены (обе вместе), то есть // console.log(getIndex(toremove[i],myarray)) и // if(typeof(array)== 'undefined'){console.log("error"); return 100}, он повторяется бесконечно, где должно быть не более двух раз.

Почему это так?Пожалуйста, помогите.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Он повторяется один раз, потому что ваш код попал в ошибку.JavaScript всегда передает переменную по ссылке.Вы можете сослаться this , чтобы понять

Uncaught TypeError: Невозможно прочитать свойство '0' из неопределенного в строке 16

, которую вы можете использовать ниже для логикиизбежать ошибки

function removeArray(toremove, myarray){
  let indexes = []
  for(i=0; i < toremove.length ; i++){
    indexes.push(getIndex(toremove[i],myarray))
  }
  for (var i = indexes.length -1; i >= 0; i--)
    myarray.splice(indexes[i],1);
}
0 голосов
/ 29 декабря 2018

Проблема в том, что вы не определяете i с var или let.В этом случае i является глобальной переменной и используется двумя функциями.

Поэтому, когда вызывается вложенная функция getIndex, i потенциально увеличивается до myarray.length.Затем, когда выполнение возвращается в цикл первой функции, i уже слишком велик, чтобы продолжать цикл.Цикл там выходит, и все сделано.

Вместо этого определите i как локальную переменную функции (var) или переменную блока (let), и она будет работать:

function removeArray(toremove, myarray) {
    for(let i = 0; i < toremove.length; i++) {
        myarray.splice(getIndex(toremove[i], myarray), 1);
    }
}
    
function getIndex(array, myarray){
    for(let i = 0; i < myarray.length; i++){
        if (typeof(array)== 'undefined') {
            console.log("error"); 
            return 100;
        }
        if ((myarray[i][0] == array[0]) && (myarray[i][1] == array[1])) {
            console.log("found match at position " + i);
            return i;
        }
    }
}

var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
var toremove=[[2,3],[3,3]];

console.log("before: " + JSON.stringify(myarray));
removeArray(toremove,myarray);
console.log("after: " + JSON.stringify(myarray));

Обычно рекомендуется не изменять массив с помощью splice, а возвращать новую копию без элементов, которые необходимо удалить.Для этого вы можете использовать filter и every.И затем вы должны присвоить возвращаемое значение функции массиву, который должен иметь результат (может также перезаписать тот же массив):

function removeArray(toremove, myarray){
    return myarray.filter(arr => 
        toremove.every(rem => arr[0] != rem[0] || arr[1] != rem[1])
    );
}
    
var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
var toremove=[[2,3],[3,3]];

console.log("before: " + JSON.stringify(myarray));
myarray = removeArray(toremove, myarray);
console.log("after: " + JSON.stringify(myarray));
0 голосов
/ 29 декабря 2018

Может быть, метод .filter будет вам полезен

function removeArray(toremove, myarray) {
    return myarray.filter((el) => {
        for (let i in toremove) {
            if (toremove[i][0] === el[0] && toremove[i][1] === el[1]) {
                return false;
            }
        }
        return true;
    });
}

var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
var toremove=[[2,3],[3,3]];
    
console.log(removeArray(toremove,myarray));
...