Нахождение симметричной разности между двумя массивами - PullRequest
0 голосов
/ 10 мая 2019

Мне нужно найти какие-либо различия между двумя массивами в элементах и ​​перенести указанные элементы в новый массив, который затем возвращается в конце.Я вытащил функцию с этого сайта через поиск, цель которого - подсчитать, сколько раз элемент встречается в массиве, и вернуть его.Сначала я объединил два массива вместе, затем применил эту функцию (модифицировал ее так, чтобы соответствовать моей задаче, насколько мог).Затем я попытался поместить элементы, которые отличались (не встречались дважды), в новый массив.Мой код, конечно, не работает, и я также новичок в Javascript, поэтому, пожалуйста, будьте осторожны со мной.

Ниже приведен код того, что я пробовал, который не проходит никаких тестов:

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

  let tempArr = arr1.concat(arr2);

  function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    if (countInArray(tempArr, tempArr[i]) < 2) {
      newArr.push(tempArr[i]);
    } 
}


  return newArr;
}

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

Ответы [ 4 ]

1 голос
/ 10 мая 2019

Можно взять Set

Объект Set позволяет хранить уникальные значения любого типа, будь то примитивные значения или ссылки на объекты.

и вернуть разницу слева и справа.

function getSymDifference(a, b) {
    return getDifference(a, b).concat(getDifference(b, a));
}

function getDifference(a, b) {
    var setB = new Set(b);
    return a.filter(v => !setB.has(v));
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));

Классический подход - объединение массива для предотвращения повторного использования уже посещенных или найденных элементов.

function getSymDifference(a, b) {
    var aa = a.slice(),
        bb = b.slice(),
        result = [],
        i, j;

    for (i = 0; i < aa.length; i++) {
        j = bb.indexOf(aa[i]);
        if (j === -1) {
            result.push(aa[i]);
        } else {
            bb.splice(j, 1);
        }
    }
    return result.concat(bb);
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 10 мая 2019

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

  1. Возврат count для countInArray (в настоящее время он возвращает неопределенное значение)

function countInArray(array, what) { var count = 0; for (var i = 0; i < array.length; i++) { if (array[i] === what) { count++; } } return count }

Удалите вызывающий countInArray из метода countInArray Выполните цикл по циклам для сравнения tempArr с каждым другим значением tempArr

for (var j = 0; j < tempArr.length; j++) { if (countInArray(tempArr, tempArr[j]) < 2) { newArr.push(tempArr[j]); } }

Рабочий код:

function diffArray(arr1, arr2) {
  let tempArr = arr1.concat(arr2);
  let newArr = [];
  function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    return count
}
  
    for (var j = 0; j < tempArr.length; j++) {
       if (countInArray(tempArr, tempArr[j]) < 2) {
         newArr.push(tempArr[j]);
       } 
    }


  return newArr;
}


let arr1 = ["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"]
let arr2 = ["diorite", "andesite", "grass", "dirt", "dead shrub"]
console.log(diffArray(arr1, arr2))

let arr3 = [1, "calf", 3, "piglet"]
let arr4 =  [7, "filly"]
console.log(diffArray(arr3, arr4))

codepen - https://codepen.io/nagasai/pen/OYNdZX?editors=1010

0 голосов
/ 10 мая 2019

Самое элегантное решение, которое я смог найти, было заявлено с использованием ES7.Я опубликую это ниже, но если кто-то может помочь мне понять, как заставить мой исходный код работать, это будет оценено.

function diffArray(arr1, arr2) {

let difference = arr1
                 .filter(x => !arr2.includes(x))
                 .concat(arr2.filter(x => !arr1.includes(x)));


  return difference;
}

В основном это фильтрует первый массив на основе того, что второй не делает 't имеет и объединяет отфильтрованный второй массив на основе того, что не происходит в первом.Таким образом, он получает обе стороны, а не одну, следовательно, «симметричный».

0 голосов
/ 10 мая 2019

обратный второй массив и, вероятно, это должно облегчить вашу задачу

Метод Array.Reverse: http://www.w3schools.com/jsref/jsref_reverse.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...