Почему моя рекурсивная функция возвращает значение undefined?

Я работаю в течение 7-го дня появления кода и не могу понять, почему мой код возвращается undefined, когда базовый случай в findNestedBags достигает первого условия (data[key].includes(color)). Он возвращает 0, когда второй случай верен, поэтому я не понимаю, почему один работает, а другой нет.

Цель состоит в том, чтобы выяснить, сколько различных сумок приведет к сумке, которая содержит сумку с «блестящим золотом». Если сумка определенного цвета содержит блестящую золотую сумку в качестве опции (найденной в значении пары ключ/значение), это опция. В качестве альтернативы, если одна из сумок в списке имеет блестящее золото в качестве опции в паре ключ/значение, это также может учитываться...

Это пример структуры данных, найденной в переменной data, только с большим количеством строк:


data = {
  'vibrant violet': [ 'light gray', 'wavy aqua' ],
  'dim fuchsia': [ 'vibrant white', 'pale beige', 'shiny gold' ],
  'drab fuchsia': [ 'dotted turquoise', 'dull crimson', 'plaid violet' ],
  'dim purple': [ 'plaid silver', 'posh gray', 'plaid beige' ],
  'mirrored lavender': [ 'vibrant lime', 'vibrant violet', 'mirrored aqua', 'clear black' ],
  'posh green': []
}
let data = indexData(input);

let count = 0;
function findMatches(color, input) {
    for (let key in input) {
        
        if (input[key].includes(color)) {
            count++
        }
        else {
            let x = findNestedBags(key, color, input)
            if (x == 1) count++
        }
    }
    return count
}

function findNestedBags(key, color, data) {
    if (data[key].includes(color)) {
        return 1
    }

    else if (data[key].length == 0) {
        return 0;
    }
    else {
        data[key].forEach(item => {
            return findNestedBags(item, color, data)
        })
    }

}
Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

forEach не возвращает значение. Если вы хотите суммировать все результаты, вы можете использовать Array#reduce. Кроме того, вы можете установить начальное значение аккумулятора в 0, передав второй аргумент, чтобы вы могли удалить проверку длины массива, равной 0.

function findNestedBags(key, color, data) {
    if (data[key].includes(color)) {
        return 1
    } else {
        return data[key].reduce((acc,item) => {
            return acc + findNestedBags(item, color, data)
        }, 0)
    }
}

… и если это массив, вам также не нужно сначала проверять length == 0

Bergi 12.12.2020 20:46

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