Разница в массиве, результат 1 или не определен - PullRequest
1 голос
/ 27 мая 2020

Array a = [1,2,3,4,5,5]

Array b = [1,2,3,5]

c = a - b

, который должен возвращать c = [4] (5 повторяется дважды, но я не хочу его на выходе) Вот мой код:

function arrayDiff(a, b) {
  var array = [];
  var diff = [];
  for (var i = 0; i<a.length; i++) {
    array[a[i]] = true;
  }

  for (var i = 0; i<b.length; i++) {
    if (array[b[i]]) {
      delete array[b[i]];
    }
    else {
      array[b[i]] = true;
    }

    for (var k in array) {
      return diff.push(k);
    }

  }

}
Test.describe("Sample tests", function() {
  Test.it("Should pass Sample tests", function() {
    Test.assertDeepEquals(arrayDiff([], [4,5]), [], "a was [], b was [4,5]");
    Test.assertDeepEquals(arrayDiff([3,4], [3]), [4], "a was [3,4], b was [3]");
    Test.assertDeepEquals(arrayDiff([1,8,2], []), [1,8,2], "a was [1,8,2], b was []");
  });
}); 

, но он возвращает странные вещи. Не могли бы вы объяснить, почему возвращается 1 и как это исправить? Это вывод console.log:


a was [], b was [4,5] - Expected: [], instead got: 1
a was [3,4], b was [3] - Expected: [4], instead got: 1
a was [1,8,2], b was [] - Expected: [1, 8, 2], instead got: undefined


Unhandled rejection TestError: a was [], b was [4,5] - Expected: [], instead got: 1

Не могли бы вы помочь мне исправить это?

Ответы [ 3 ]

1 голос
/ 27 мая 2020

в вашем коде есть пара проблем

  1. 3-й для l oop, который вложен во 2-й для l oop, не должен быть вложен во 2-й l oop.

  2. .push() метод добавляет новый элемент в массив и возвращает длину массива после добавления нового элемента. Вместо того, чтобы возвращать возвращаемое значение функции pu sh, вам нужно вернуть массив diff.

Вот фиксированный код

const a = [1,2,3,4,5,5];
const b = [1,2,3,5];

function arrayDiff(a, b) {
  var array = [];
  var diff = [];
  for (var i = 0; i<a.length; i++) {
    array[a[i]] = true;
  }
  
  for (var i = 0; i<b.length; i++) {
    if (array[b[i]]) {
      delete array[b[i]];
    }
    else {
      array[b[i]] = true;
    }
  }
    
  for (var k in array) {
      diff.push(Number(k));
  }
  
  return diff;
  
}

console.log(arrayDiff(a, b));

Изменить

Согласно вашим комментариям, если a = [] и b = [1, 2], то вывод должен быть [], а для a = [1, 8, 2] и b = [], вывод должен быть [1, 8 ,2].

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

Вы можете получить желаемый результат, отфильтровав массив a и проверив, если текущий элемент в массиве a существует в массиве b или нет.

let a = [1, 8 ,2];
let b = [];

function arrayDiff(a, b) {
  return a.filter(n => !b.includes(n));
}

console.log(arrayDiff(a, b));
0 голосов
/ 27 мая 2020

Вы можете взять Set и отфильтровать массив.

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

console.log(arrayDiff([1, 2, 3, 4, 5, 5], [1, 2, 3, 5]));
0 голосов
/ 27 мая 2020

Ваш код выглядит хорошо. Для упрощения может потребоваться некоторая модификация.

function arrayDiff(a, b) {
  return a.filter((aItem) => b.indexOf(aItem) === -1);
}
...