Объединить неизвестное количество массивов аргументов. Выбрасывать дубликаты

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

Я использовал 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.info(unique);
}

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

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

return a.concat(b); /n TypeError: a.concat is not a function

Ожидаемый результат: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].

Добавьте начальное значение [] к .reduce. Это не удается, потому что это делает 1.concat в первом тестовом примере

Jonas Wilms 16.02.2019 17:38

Каков ожидаемый результат?

Fullstack Guy 16.02.2019 17:43

Вы передаете несколько аргументов, но функция имеет только один аргумент для получения

Prasanna Brabourame 16.02.2019 17:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете взять чек за элемент, если это массив, и сгладить этот массив.

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

console.info(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.info(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.info(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.info(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ принят как подходящий

Это потому, что сигнатура вашей функции принимает только один параметр, 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.info(unique);
}

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

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

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

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

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

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

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

console.info(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.info(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.info(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.info(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Другие вопросы по теме