Объединить неизвестное количество массивов аргументов.Бросить дубликаты - PullRequest
0 голосов
/ 16 февраля 2019

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

Я использовал map, чтобы поместить каждый массив в один новый массив.Я использовал reduce, чтобы объединить массивы.Я использовал Set, чтобы бросать дубликаты.

Это работало только в этом случае

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

Я не знаю, почему это не работаетв этих случаях:

Argument Fail1 // uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);

Argument Fail2 // uniteUnique([1, 3, 2], [1, [5]], [2, [4]]);
Argument Fail3 // uniteUnique([1, 2, 3], [5, 2, 1]);

Это мой код

function uniteUnique(arr) {
  let test = [];
  arr.map(function(argu) {
    test.push(argu);
  }, []);

  let flat = test.reduce(function(a, b) {
    return a.concat(b);
  });

  let unique = new Set(flat);

  console.log(unique);
}

Что не так?Было бы очень любезно, если бы кто-нибудь мог сказать мне, почему мой код не работает с Argument Fail 1-3.

В этих случаях выдается ошибка:

return a.concat (b);/ n TypeError: a.concat не является функцией

Ожидаемый результат: uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]) должен вернуть [1, 3, 2, 5, 4].uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) должен вернуть [1, 3, 2, [5], [4]].uniteUnique([1, 2, 3], [5, 2, 1]) должен вернуть [1, 2, 3, 5].uniteUnique([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]) должен вернуть [1, 2, 3, 5, 4, 6, 7, 8].

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Это потому, что ваша подпись функции принимает только один параметр, arr.И здесь вы передаете только один:

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

Вот почему это работает.Где В случаях сбоя вы передаете несколько массивов:

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

Следовательно, требуется всего лишь [1, 3, 2], игнорируя остальные и пытаясь уменьшить первый, начиная с первого элемента 1, который явно не является массивом и не имеет concat.

То, что вы хотите сделать, это изменить сигнатуру вашего метода - и удалить бесполезный map:

function uniteUnique(...test) {

  let flat = test.reduce(function(a, b) {
    return a.concat(b);
  });

  let unique = new Set(flat);

  console.log(unique);
}

Используя синтаксис you 'вставляя test все аргументы в виде массива.

Кстати, вы также можете использовать Array.flat , где реализовано (или полифилл, где нет):

const flatUnique = (...test) => new Set(test.flat())

И если вы хотите иметь массив вместо Set, вы можете получить его снова, используя синтаксис распространения:

const flatUnique = (...test) => [...new Set(test.flat())]
0 голосов
/ 16 февраля 2019

Вы можете использовать плоский и Set

const uniteUnique = (array) => [...new Set(array.flat(Infinity))];

console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 16 февраля 2019

Вы можете проверить элемент, если он является массивом, и выровнять этот массив.

const
    flat = array => array.reduce((r, a) => r.concat(Array.isArray(a) ? flat(a) : a), []),
    uniteUnique = (...array) => [...new Set(flat(array))];

console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...