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