Задача, Массив совпадений. JS

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

ЗАДАЧА:
Дополни код функции таким образом, чтобы она возвращала новый массив matches, в котором будут только те аргументы, начиная со второго, которые есть в массиве первого аргумента.

Например, findMatches([1, 2, 3, 4, 5], 1, 8, 2, 7) должна вернуть массив [1, 2], потому что только они имеются в массиве первого аргумента.

Условие и моё рассуждение ниже - не понимаю! Может наведете на мысль посдказкой:

УСЛОВИЕ:
// Change code below this line
function findMatches() {
const matches = []; // Don’t change this line

// Change code above this line
return matches;
}

РЕШЕНИЕ (не работает полностью):
// Change code below this line
function findMatches(…args) {
const matches = []; // Don’t change this line
for (let arg of args) {

}

// Change code above this line
return matches;
}

Для начала положи значения в переменные вот так

function findMatches(inArr, ...possibleMatches) {
	console.log('arr', inArr)
	console.log('matches', possibleMatches)
}

findMatches([1,2,3], 3, 2)
findMatches([1,2,3,4])
findMatches([1,2,3,4], 2, 3, 4, 5, 6, 7, 8)

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

Если я правильно понял Вашу подсказку, то мне надо перебрать массив possibleMatches сравнить значения с данными другого набора чисел и совпадающие числа “запушить” в массив manches.
Я вроде, так и сделал, но Автопроверка “говорит”, что не работает. Где я ошибаюсь?
Вот решение (по поводу трех точек - в коде, все как надо, здесь просто копирование):

// Change code below this line
function findMatches(args, ...possibleMatches) {
  const matches = []; // Don't change this line
  for (let possibleMatche of possibleMatches) {
    if (agrs === possibleMatche) {
      matches.push();      
    }    
  }
    // Change code above this line
  return matches;
}

Вызов findMatches([1, 2, 3, 4, 5], 1, 8, 2, 7) возвращает [1, 2] - НЕ РАБОТАЕТ
Вызов findMatches([4, 89, 17, 36, 2], 8, 17, 89, 27, 2) возвращает [17, 89, 2] - НЕ РАБОТАЕТ
Вызов findMatches([10, 24, 41, 6, 9, 19], 24, 11, 9, 23, 41) возвращает [24, 9, 41] - НЕ РАБОТАЕТ
Вызов findMatches([63, 11, 8, 29], 4, 7, 16) возвращает [] - НЕ РАБОТАЕТ
Объявленная функция ‘findMatches’ - РАБОТАЕТ

Я начну с лирики. Частый и полезный способ проверять рабочесть своего кода это придумать 2-3 примера использования функции с понятным результатомм и сравнить что функция выдает по факту. Кстати, эта автоматическая проверка работает именно по этому принципу (этот же принцип лежит в основе юнит тестирования).

Отличная идея подходить к разработке с позиции нескольких примеров. Написать функцию, несколько вызовов и доделывать функцию до тех пор пока результаты вызовов не будут равны ожидаемым.

Я проделываю такие же шаги (только быстро и иногда срезая углы в виду опыта и привычки).

Значит тебе нужно взять функцию и посмотреть что она возвращает для разных случаев. В коде что ты кинул как раз это и описано:

function findMatches(args, ...possibleMatches) {
  const matches = []; // Don't change this line
  for (let possibleMatche of possibleMatches) {
    if (agrs === possibleMatche) {
      matches.push();      
    }    
  }
    // Change code above this line
  return matches;
}

console.log(findMatches([1, 2, 3, 4, 5], 1, 8, 2, 7) ) // ожидается [1,2], а что ты видишь в консоли?

Конкретика.

Функция не работает, выдает ошибку из-за описки в названии переменной agrs agrs === possibleMatche а аргумент называется args. Классическая описка.

Исправив описку сравниваю результат выполнения твоей функции с ожидаемым:

function findMatches(args, ...possibleMatches) {
  const matches = []; // Don't change this line
  for (let possibleMatche of possibleMatches) {
    if (args === possibleMatche) {
      matches.push();      
    }    
  }
    // Change code above this line
  return matches;
}
console.log(findMatches([1, 2, 3, 4, 5], 1, 8, 2, 7)) // результат [], а ожидается [1,2]

Смотрю дальше внимательнее в код и вижу сравнение массива с элементом массива args === possibleMatche. По смыслу тебе нужно не сравнить значение переменных а убедиться что внутри массива ags есть значение possibleMatche .

Ага, я должен проверить includes! OK

function findMatches(args, …possibleMatches) {
const matches = []; // Don’t change this line
for (let possibleMatche of possibleMatches) {
if (args.includes(possibleMatches)) {
matches.push(args);
}
}
// Change code above this line
return matches;
}
findMatches([1,2,3],3,45,90);

Блин, ничего - что мне подтянуть в понимании, чтобы получилось?

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

Я дам только один пример и методологию.

for (let possibleMatche of possibleMatches) {
    if (args.includes(possibleMatches)) {

У тебя почему-то результат выполнения всей функция это пустой массив. Пустота массива зависит от условия в куске кода что я дал выше. Ты уверен что условие написано корректно. Но что-то в нем не так если результат не ожидаем. Напиши несколько консоль логов. Потом сравни наблюдаемые значения и попробуй понять то ли написано в коде чего ты стремишься достичь. Прямо так:

for (let possibleMatche of possibleMatches) {
    console.log('possibleMatche', possibleMatche)
    console.log('possibleMatches', possibleMatches)
    console.log('args.includes(possibleMatches)', args.includes(possibleMatches))
    if (args.includes(possibleMatches)) {

Не понимаю - при выведении в Консоль Лог ничего нет - ни ошибки ни результатов… Буду думать…
(использую VSC)

Покажи скриншот всего окна браузера с консолью. Возможно включены фильтры которы скрывают консольные данные. Возможно бесконечный цикл. По картинке смогу подсказать

А пока что вот код который точно выводит значения в консоль. Теперь нужно посидеть подумать как получается неожидаемый результат:

function findMatches(args, ...possibleMatches) {
    const matches = []; // Don’t change this line
    for (let possibleMatche of possibleMatches) {
        console.log('possibleMatche', possibleMatche)
        console.log('possibleMatches', possibleMatches)
        console.log('args.includes(possibleMatches)', args.includes(possibleMatches))
        if (args.includes(possibleMatches)) {
            matches.push(args);
        }
        console.log('matches', matches)
    }
// Change code above this line
    return matches;
}

console.log('findMatches([1, 2, 3], 3, 45, 90)', findMatches([1, 2, 3], 3, 45, 90))

1 лайк

Может код просто не запускается? Тоже частая вещь для проверки. Я убеждаюсь в запускаемости кода, вставляя alert(1) сначала в начало скрипта. А потом если вижу в браузере алерт, вставляю алерт в тело функции.

Фильтры стоят корректные.

1 лайк

Хуже всего, что Автопроверка так же не пропускает Ваше решение… . Буду обращаться напрямую к “владельцу” Автопроверки - постановщику задачи.

Так мое решение и не рабочее. Я просто поправил явную ошибку которая не давал запускаться твоему решению. Там висят логические ошибки, для поиска которых я дал инструмент (с консоль логами).

1 лайк

Принято. Спасибо