Я работаю в течение 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)
})
}
}
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