检查元素是否为使用递归的数组



我想检查数组中的元素是否为另一个数组。我正在解决一个代码挑战,其中的问题是通过数组迭代和检查一个7,但如果一个元素是一个数组,我想连续检查每个嵌套数组是否有7。

我在我的第一个'if'语句中有console.log(),并且我已经看到sevenBoom()被调用了不止一次。但由于某些原因,它没有返回"Boom!"'

SevenBoom应该返回'Boom!如果有个7的话

function sevenBoom(arr) {
if (arr.includes(7)) {
return "Boom!";
}

arr.forEach((val) => {
if (Array.isArray(val)) sevenBoom(val);
});
}
sevenBoom([1, 3, 4, 6, [7]) // Returns undefined
sevenBoom([3, 7, 8, 9]) // Returns 'Boom!'

您可以将布尔值作为结果,并使用Array#some来检查数组。

function hasSeven(array) {
function seven(a) {
return a.includes(7) || a.some(v => Array.isArray(v) && seven(v));
}
return seven(array)
? 'Boom!'
: 'There is no 7';
}

console.log(hasSeven([7]));
console.log(hasSeven([[7]]));
console.log(hasSeven([[[7]]]));
console.log(hasSeven([]));
console.log(hasSeven([[]]));
console.log(hasSeven([[[]]]));

const sevenBoom = (arr) => {
const recurse = (arr) => arr.some(n => Array.isArray(n) ? recurse(n) : n === 7);
if (recurse(arr)) {
return 'Boom';
}
}

这是假设除了'Boom'应该返回的是void。对于递归来说,这里有点尴尬,因为如果满足某些条件而不满足其他条件,则希望返回字符串。

首先,您需要返回第二个if条件的值。

但是forEach()不能被中断(例如:用return语句),并且将对所有项目运行。因此,您可以使用forEach()之外的标志变量来跟踪,并在此基础上返回结果。

function sevenBoom(arr) {
if (arr.includes(7)) {
return "Boom!";
}
let found = false;
arr.forEach((val) => {
if (Array.isArray(val))                          if(sevenBoom(val)) found="Boom!"; 
})
return found;
}

console.log(sevenBoom([1,2,3]));
console.log(sevenBoom([1,2,7]));
console.log(sevenBoom([1,2,[2,7]]));
console.log(sevenBoom([1,2,[2,3,[4,5]]]));
console.log(sevenBoom([1,2,[2,3,[4,7]]]));

注意:sevenBoom()如何在if语句中直接使用。这是因为真值和假值的概念。

PS:如上所述,forEach()将运行所有项目,无论什么。您可以使用任何其他循环机制,如简单的for loop,some()等。我只是复制了你的代码,因此使用了forEach()

我会在检查元素是否为数组的同一个循环中检查元素是否为7,这样可以避免不必要地遍历数组。

const sevenBoom = arr => {
for (const ele of arr) {
if (ele === 7) return 'Boom';
if (Array.isArray(ele)) {
//this prevents you from halting your function early
//you only want to return in the loop if a 7 is found
if (boom(ele) === 'Boom') return 'boom'
}
}
}

您可以在使用.includes()方法之前使用.flat(depth)方法来平整化每个数组。选择一个覆盖项目中所有可能数组的深度。

function sevenBoom(arr) {
return arr.flat(10).includes(7) ? 'Boom!' : '-'
}

let a = [1, 3, 4, 6, [7]],
b = [3, 7, 8, 9],
c = [1,2,[5,6,[3,5,[7,6]]]],
d = [0],
e = [1, [5, 4], 3, 5, [7]];
function sevenBoom(arr) {
return arr.flat(10).includes(7) ? 'Boom!' : '-'
}
for(let arr of [a,b,c,d,e]) {
console.log( sevenBoom( arr ) );
}
console.log( e ); //Original array remains unchanged

如果根数组中不存在7,则函数不返回任何内容。试试这个,只是一个小的重构:

function sevenBoom(arr) {
if (arr.includes(7)) return 'Boom!';
for (let val of arr) {
if (Array.isArray(val)) {
if (sevenBoom(val)) return sevenBoom(val);
}
}
return false;
}

相关内容

  • 没有找到相关文章

最新更新