在新数组中遍历 javascript 和 return 中的数组

iterate through array in javascript and return in new array

我完全不熟悉编码:我想遍历数组 input,select 只有正数,然后将它们放入一个新数组 liste 然后在控制台打印新数组。我在这里做错了什么?!?

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15];

var liste = [];

function cut(input){
    for (var i=0; i<cut.length; i++){
        if (i>0){
            liste.push(input[i]);
            return liste;
    } 
}

var result = cut(input);
console.log(result);
 for (var i=0; i<input.length; i++){

此处您希望用户 input.length 而不是 cut.length,因为您希望 i 遍历输入数组中的所有索引。

您还忘记了用大括号来关闭 for 循环

此外,您是从循环内部返回,这意味着循环已退出,因此一旦找到第一个元素,您将退出该函数,因此您的列表中只会得到一个元素。

你的代码有 4 个错误

  1. i

  2. i>0 ,它应该是 input[i]>0 ,因为你正在比较输入 indecis

  3. if语句的花括号没有闭合

  4. Return不在for循环外

修复所有这些后它应该可以工作

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15];

var liste = [];
function cut(input){
  
    for (var i=0; i<input.length; i++){ //error 1
        if (input[i]>0){//2
            liste.push(input[i]);
        }//error 3
    } 
        return liste;//error 4
    }

var result = cut(input);
console.log(result);

由于我无法在评论中准确描述我想解释的内容,因此我发布了一个答案:

当我像这样格式化我的代码时,我发现平衡大括号要容易得多

function cut(input)
{
    for (var i=0; i<cut.length; i++)
    {
        if (i>0)
        {
            liste.push(input[i]);
            return liste;
    } 
}

现在很明显不平衡支架在哪里。

还有其他语法错误,其他人已经指出:

  1. 不是cut.length,而是input.length
  2. 您的 if 语句需要 if (input[i] > 0),而不是 if (i > 0)
  3. return liste 不应在循环内部,而应在函数末尾,因为一旦找到一个值,它将停止循环并立即 return 只有 1 个值在内部数组。

这里应该是您打算执行的工作示例。除了那几个语法错误,逻辑做得很好!

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15];

function cut(input){
    let liste = [];
    for (var i=0; i<input.length; i++){
        if (input[i]>0){
            liste.push(input[i]);
        }
    }
    return liste;
}

var result = cut(input);
console.log(result);

像这样的问题可以通过谷歌搜索来解决,但目前看来,在你的第二个表达式中,你有 i<cut.length 这没有意义。您必须将其更改为 i < input.length 因为您想要遍历输入。您也不能有 return 语句,因为您将退出循环。您还可以使用高阶函数,例如过滤函数 return 任何大于 0 的数字。input.filter((num) => num > 0) 希望这对您有所帮助!!

我会尝试在这里结合其他几个答案中的观点,并添加更多解释。

修复 For 循环,一次一行

你的大部分代码都很好;唯一的问题是在您的 for 循环中。让我们从上到下回顾一下。

for (var i=0; i<cut.length; i++){

你的想法是正确的。但是,在这个 for 循环中,您希望 i 从 0 循环到您正在循环的数组的长度——而不是您编写的函数的长度。因此,您应该将 cut.length 替换为 input.length。这样,i 将从 0 循环到 14。

    if (i>0){

i 是一个数字,用于跟踪您进入阵列的距离。如上所述,对于您的数组,它将从 0 到 14。您正在尝试检查第 i 位置的数字是否为正数,而不是 i 本身是否为正数。要访问第 i 个位置的数字,您可以使用 input[i] 而不是 i.

        liste.push(input[i]);

这条线没问题;干得好!您正在 input 数组的第 i 位置找到数字并将其添加到 liste。由于之前的 if 语句,只有当该数字为正数时才会发生这种情况。

        return liste;

此行将立即 return 列表,退出您的 cut 功能。您希望仅在完成所有数字的循环后才发生这种情况,因此您只需要在 for 循环之后移动此行。

还有最后一件事——您忘记了用花括号来结束您的 if 语句。小心这一点,因为它会弄乱你的程序。

我已经进行了所有这些更改。您可以在以下代码段中查看它们:

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15];

var liste = [];

function cut(input){
    for (var i=0; i<input.length; i++){
        if (input[i]>0){
            liste.push(input[i]);
        }
    }
    return liste;
}

var result = cut(input);
console.log(result);

一些需要探索的东西:

  • 如果您将 var liste = []; 移到 cut 内会发生什么,就像 Shmack 的回答一样?代码还能用吗?为什么?
  • 如果将 cut 中的所有 input 重命名为其他名称会怎样?代码还能用吗?为什么?

理解这些问题不是必需的,但了解答案可能会帮助您在未来更好地编码。

更好的方法

等等,还有更多!如果有一个 built-in 功能可以为我们更轻松地做到这一点呢?

介绍filter

filter 是一种所有数组都具有的有用方法,可让它们根据您提供的函数过滤其内容。使用 filter 可以让您完全绕过编写 for 循环(尽管练习编写它们仍然很好;有时它们非常有用)。

你提供给filter的函数通常写成一个"arrow function",基本上就是转这个:

function(input){
    //Do stuff
    return output;
}

进入这个:

(input) => {
    //Do stuff
    return output;
}

它对于编写快速的小函数非常有用,所以我将在示例中使用它。

要使用 filter 和箭头函数过滤数组,您所要做的就是:

let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15];
var result = input.filter((number)=>{return number > 0});
console.log(result);