尝试遍历数组

时间:2020-06-08 04:42:05

标签: javascript arrays loops for-loop

所以我试图告诉绵羊是否存在(真),以及是否是(假)将绵羊从阵列中弹出。

我是CodeWars的新手,并且说实话。.最近我还没有真正使用for循环。

问题: 考虑一组绵羊/绵羊名单,其中可能缺少一些绵羊。我们需要一个函数来计算数组中存在的绵羊的数量(真意味着存在)。

我的代码:

function countSheeps(arrayOfSheep) {
  for (i = 0; i < arrayOfSheep.length; i++ ) {
    console.log(arrayOfSheep[i])

    sheep = 0
    if (arrayOfSheep === true) {
      return sheep++
    } else {
      arrayOfSheep.pop()
    }
  }
  console.log(sheep)
}

测试:

var array1 = [true,  true,  true,  false,
              true,  true,  true,  true ,
              true,  false, true,  false,
              true,  false, false, true ,
              true,  true,  true,  true ,
              false, false, true,  true ];

Test.expect(countSheeps(array1) == 17, "There are 17 sheeps in total")

4 个答案:

答案 0 :(得分:1)

您可以在Array上使用filter方法。

var array1 = [true,  true,  true,  false,
              true,  true,  true,  true ,
              true,  false, true,  false,
              true,  false, false, true ,
              true,  true,  true,  true ,
              false, false, true,  true ];
              
              
getCount = (data) => data.filter(d => d)

console.log(getCount(array1).length);

答案 1 :(得分:1)

似乎需要很多工作来解决此问题,让我们看一下问题:

function countSheeps(arrayOfSheep) {
  for (i = 0; i < arrayOfSheep.length; i++ ) {
    console.log(arrayOfSheep[i])

    sheep = 0
    if (arrayOfSheep === true) {
      return sheep++
    } else {
      arrayOfSheep.pop()
    }
  }
  console.log(sheep)
}
    if (arrayOfSheep === true) {

arrayOfSheep是一个数组。看来您正在遍历数组,并且想要使用i作为索引,所以应该是arrayOfSheep[i]

      return sheep++

这将使sheep的值sheep增至1,并立即返回原始值0,从而跳过数组的其余部分。您的函数在第一次找到真实值时将返回0。

arrayOfSheep.pop()

这将从数组中删除最后一个元素。在检查之前肯定不想做的事情...

sheep = 0

似乎您想让绵羊将“ true”值的计数存储在数组中。每次通过数组将其重置为0时,都意味着您只会计算最终的“ true”值。

  console.log(sheep)
}

这里没有return语句。如果将其移到数组的末尾,则函数将默认返回undefined。我在代码战上运行测试,我想您会看到0undefined的结果。

靠近您的代码并使之工作将是这样的:

function countSheeps(arrayOfSheep) {
  let sheep = 0; // set value once before counting
  for (let i = 0; i < arrayOfSheep.length; i++ ) {
    if (arrayOfSheep === true) {
      sheep++; // increment value of sheep variable
    }
  }
  return sheep; // return the cound in the sheep variable as your function return value
}

不过,更新的javascript中有更快的方法。您可以filter 取真值并返回结果的长度:

function countSheep(arrayOfSheep) {
  // trueValues will only havet he true values from arrayOfSheep
  let trueValues = arrayOfSheep.filter(sheep => sheep === true);
  return trueValues.length;
}

对于reduce来说,另一种方法似乎很完美,它可以对数组的每个元素进行操作:

function countSheep(arrayOfSheep) {
  return arrayOfSheep.reduce((acc, sheep) => sheep ? acc + 1 : acc, 0);
}

这从0值开始,并为数组中的每个元素调用函数。如果值为true,则返回acc + 1,否则返回acc,且不做任何更改。因此,循环acc的第一次设置为0,而sheep将是数组中的第一个值。如果为true,则它将返回1,否则将返回0。下一次通过数组acc将是该返回值(0或1),而绵羊将是数组中的下一个元素。

答案 2 :(得分:0)

如下所示将完成工作。

function countSheep(input){
    let sheep = 0;
    for(i in input){
        if(input[i]){
            sheep++;
        }
    }
    return sheep;
}

答案 3 :(得分:0)

我可能会误解您的问题,但是如果您要计算正布尔值的数量,请看以下示例。

const array1 = [true,  true,  true,  false,
              true,  true,  true,  true ,
              true,  false, true,  false,
              true,  false, false, true ,
              true,  true,  true,  true ,
              false, false, true,  true ]
              
console.log(array1.filter(entry => entry).length)