我正在 freeCodeCamp.com 上进行挑战,以提高我的编码知识。目前正在研究我的 JavaScript 算法和数据结构。
以下是提示以及我解决问题的方法:
提示:
我们定义了一个函数
,它接受嵌套数组filteredArray
和arr
作为参数,并返回一个新数组。elem
表示一个元素,可能出现在elem
内嵌套的一个或多个数组中,也可能不出现。使用 for 循环修改该函数,以返回传递数组的过滤版本,以便删除嵌套在arr
中且包含arr
的任何数组。elem
我的解决方案:
function filteredArray(arr, elem) {
let newArr = [];
// Only change code below this line
for (let i = 0; i < arr.length; i++) {
if (arr[i].indexOf(elem) == -1) {
newArr.push(arr[i]);
}
};
// Only change code above this line
return newArr;
}
console.log(filteredArray([
[3, 2, 3],
[1, 6, 3],
[3, 13, 26],
[19, 3, 9]
], 3));
我的问题:不存在“问题”。我只是想要一些学习理解。我了解问题的根源和正在发生的事情,并且我了解我的解决方案。我不明白的是我们如何仅使用一个 for 循环来迭代嵌套数组。据我了解,对于以下数组:
[[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]]
如果我使用:
for (i = 0; i < arr.length; i++) {
};
我们正在遍历数组到每个子数组。但要迭代子数组,我们必须嵌套一个额外的 for 循环:
for (let i = 0; i < arr.length; i++) {
for (let j = 0; i < arr[i].length; i++) {
};
这样做之后,使用 if/else 语句就有意义了。如:
if (arr[j].indexOf(elem) > 0) {
return newArr.pop(arr[i]
} else {
return newArr.push[i]
};
总而言之,我想我不明白为什么第二个for循环和else语句是不必要的。也许我错过了一些东西。如果可以的话请提供一些指导。提前致谢。 `
正如评论中提到的,内置的 Javascript 数组方法可以自行迭代。例如,这里是几乎相同的解决方案,但使用 .includes() 而不是 .indexOf():
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (!arr[i].includes(elem)) {
newArr.push(arr[i])
}
}
return newArr;
}