Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript for循环中的三元算子问题_Javascript - Fatal编程技术网

Javascript for循环中的三元算子问题

Javascript for循环中的三元算子问题,javascript,Javascript,只是有点好奇为什么for循环中一个if/else语句的代码可以工作,而另一个用三元运算符简化的代码却不能工作 说明是:定义一个函数takeWhile,该函数将回调函数和数组作为参数。takeWhile将遍历数组,将每个数组元素作为参数传递给回调函数。从回调返回true的每个序列数组值都应该收集到一个新数组中。一旦回调中的数组值返回false,takeWhile就应该返回这个新数组 此代码工作正常: const takeWhile = (cb, arr) => { // ADD CODE

只是有点好奇为什么for循环中一个if/else语句的代码可以工作,而另一个用三元运算符简化的代码却不能工作

说明是:定义一个函数takeWhile,该函数将回调函数和数组作为参数。takeWhile将遍历数组,将每个数组元素作为参数传递给回调函数。从回调返回true的每个序列数组值都应该收集到一个新数组中。一旦回调中的数组值返回false,takeWhile就应该返回这个新数组

此代码工作正常:

const takeWhile = (cb, arr) => {
  // ADD CODE HERE...
  //empty array to push true values into 
  const result = [];
  //for loop
  for(let i in arr){
  //if callback yields true, push to result array.
    if(cb(arr[i])){ 
      result.push(arr[i]);
    // else return result
    } else {
      return result;
    }
  }
  //once loop has concluded, return result
  return result;
};

/*
 * Uncomment the following lines and Run Code to test your work
 */
const isEven = (elem) => (elem % 2 === 0);
console.log(takeWhile(isEven, [2,4,5,6,8])); // -> [2,4]
console.log(takeWhile(isEven, [7, 100, 14])); // -> []
console.log(takeWhile(isEven, [10, 8, 6, 4, 2])); // -> [10, 8, 6, 4, 2]
这段代码使用的(我认为)是相同的逻辑,但没有使用三元运算符填充结果数组并正确返回

const takeWhile = (cb, arr) => {
  //empty array to push true values into 
  const result = [];
  //for loop
  for(let i = 0; i < arr.length; i++){
  //if callback yields true, push to result array, else return result
    return cb(arr[i]) ? result.push(arr[i]) : result;
  } 
  return result;
};

/*
 * Uncomment the following lines and Run Code to test your work
 */
const isEven = (elem) => (elem % 2 === 0);
console.log(takeWhile(isEven, [2,4,5,6,8])); // -> [2,4]
console.log(takeWhile(isEven, [7, 100, 14])); // -> []
console.log(takeWhile(isEven, [10, 8, 6, 4, 2])); // -> [10, 8, 6, 4, 2]

返回1,当它应该返回[2,4]

您之前的逻辑是仅当
cb(arr[i])
为false时才返回。现在,您总是在第一次循环迭代之后返回


另外
array.push
返回新数组的长度,而不是新数组的长度

您之前的逻辑是,只有当
cb(arr[i])
为falsy时,才返回。现在,您总是在第一次循环迭代之后返回


另外
array.push
返回新数组的长度,而不是新数组的长度

考虑第二个示例的行

return cb(arr[i]) ? result.push(arr[i]) : result;
这将在第一个循环中结束函数,无论条件如何。虽然函数将根据条件返回,但它将在第一次迭代中返回

如果三元运算符不包含任何语句,则只能使用它们来代替
if-else
语句
return
是上述代码中的一条语句

这不是问题,只是为了获取信息,您可以使用
filter()
获取更简单的代码

const getEvens = (arr) => arr.filter(x => x % 2 === 0);

考虑第二个示例的行

return cb(arr[i]) ? result.push(arr[i]) : result;
这将在第一个循环中结束函数,无论条件如何。虽然函数将根据条件返回,但它将在第一次迭代中返回

如果三元运算符不包含任何语句,则只能使用它们来代替
if-else
语句
return
是上述代码中的一条语句

这不是问题,只是为了获取信息,您可以使用
filter()
获取更简单的代码

const getEvens = (arr) => arr.filter(x => x % 2 === 0);
返回cb(arr[i])?结果推送(arr[i]):结果

也就是说:如果将当前数组项传递给回调返回一个truthy值,则在将当前项推送到结果数组后返回结果数组的长度,否则返回结果数组

Array.prototype.push
返回数组的长度。这里的三元数将以任何方式返回第一个循环。

返回cb(arr[i])?结果推送(arr[i]):结果

也就是说:如果将当前数组项传递给回调返回一个truthy值,则在将当前项推送到结果数组后返回结果数组的长度,否则返回结果数组

Array.prototype.push
返回数组的长度。这里的三元数将以任何方式返回第一个循环。

此条件:

if(cb(arr[i])){ 
   result.push(arr[i]);
   // else return result
} else {
   return result;
}
不同于:

return cb(arr[i]) ? result.push(arr[i]) : result;
在第一个示例中,仅当
时返回!cb(arr[i])
which不可能使用三值运算符,因为三值运算符的操作数是空的。而
return
是一个。如果出现以下情况,应使用
if-else

if(cb(arr[i])){ 
   result.push(arr[i]);
   // else return result
} else {
   return result;
}
不同于:

return cb(arr[i]) ? result.push(arr[i]) : result;

在第一个示例中,仅当
时返回!cb(arr[i])
which不可能使用三值运算符,因为三值运算符的操作数是空的。而
return
是一个。您应该使用
如果其他

来实现预期的结果,请按如下所示修改三元值

cb(arr[i]) ? result.push(arr[i]) : i = arr.length;
  • 删除要执行的for循环中的return
  • 返回结果。push(arr[i])是所推的值的长度
  • 三元值的第二个参数将i值更改为循环停止的数组长度
  • 三元的其他问题和代码中的第一个选项,三元没有返回选项,如下所示

     cb(arr[i]) ? result.push(arr[i]) : return result; // invalid syntax but equivalent to option 1 logic which you are trying
    
    请参阅以下连结-

    代码示例

    const takeWhile=(cb,arr)=>{
    //将真值推入的空数组
    常量结果=[];
    //for循环
    for(设i=0;i{
    结果推(arr[i]);
    返回结果
    }
    常量isEven=(元素)=>(元素%2==0);
    log(takeWhile(isEven[2,4,5,6,8]);//->[2,4]
    log(takeWhile(isEven[710014]);//->[]
    
    log(takeWhile(isEven[10,8,6,4,2]);//->[10,8,6,4,2]
    为了达到预期的结果,对三元进行如下修改

    cb(arr[i]) ? result.push(arr[i]) : i = arr.length;
    
  • 删除要执行的for循环中的return
  • 返回结果。push(arr[i])是所推的值的长度
  • 三元值的第二个参数将i值更改为循环停止的数组长度
  • 三元的其他问题和代码中的第一个选项,三元没有返回选项,如下所示

     cb(arr[i]) ? result.push(arr[i]) : return result; // invalid syntax but equivalent to option 1 logic which you are trying
    
    请参阅以下连结-

    代码示例

    const takeWhile=(cb,arr)=>{
    //将真值推入的空数组
    常量结果=[];
    //for循环
    for(设i=0;i{
    结果推(arr[i]);
    返回结果
    }
    常量isEven=(元素)=>(元素%2==0);
    log(takeWhile(isEven[2,4,5,6,8]);//->[2,4]
    log(takeWhile(isEven[710014]);//->[]
    log(takeWhile(isEven[10,8,6,4,2]);//->[10,8,6,4,2]