只是出于好奇,为什么在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]


例如

console.log(takeWhile(isEven, [2,4,5,6,8])); // -> [2,4]


返回1,应返回[2,4]

最佳答案

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

那就是说:如果将当前数组项传递给回调函数返回一个真实值,则在将当前项推入该数组后返回结果数组的长度,否则返回结果数组。

Array.prototype.push返回数组的长度。此处的三进制将以任何一种方式在第一个循环上返回。

关于javascript - 有关for循环内的三元运算符的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56568501/

10-12 13:17