无法弄清楚如何使用 if 语句通过回调检查数组中的所有元素并检查它们是否全部为 true

cannot figure out how to use an if statement to check all elements in an array with a callback and check if they are all true

提问人:Royce James Calvin 提问时间:9/16/2023 最后编辑:Royce James Calvin 更新时间:9/18/2023 访问量:55

问:

我不确定如何检查回调的每个元素并检查它们是否都为真;我也很陌生,尝试编码,如果它看起来很糟糕,很抱歉。

编写一个接受数组和回调作为参数的函数。 该函数应返回一个布尔值,指示 数组在传递到回调时返回 true。 不要使用内置的 Array#everymyEvery

let myEvery = function(arr, cb) {
   let bool = false;
   if (cb(arr) === true) {
      bool = true;
   }
   return bool;
};
JavaScript 数组函数 回调

答:

0赞 Stephen Arsenault 9/16/2023 #1

在这种情况下,应该使用@Kooilnc的响应,但要了解如何创建使用回调的回调和函数,或条件中的验证函数,我会写一些帮助我更好地理解它们的东西。[].every()

这个问题并不是真正的回调上下文,而只是以“一流”方式使用函数。在我看来,回调的设计和命名似乎是因为它们能够在执行上下文完成时调用函数/方法,但 def 不仅限于此。

要给出一个回调的例子,并检查“callback”或“高阶函数”返回的值,请参阅下面的业余示例。

let myArr = [0,2,4,6,8,9,10,11,12,14];

let isEvenOdd = function(val) {
  console.log('checking if value is even or odd.');
  return (val % 2 === 0) ? 'even' : 'odd';
}

let callback = function() {
  console.log('done!\n\tlogged within the cb!');
}

let firstOddValue = function(arr, validator, cb) {
  let tmp = arr;
  let val = tmp.shift();
  let eo = validator(val);
  if (eo === 'even') {
    console.log(`${val} is even`);
    return firstOddValue(tmp, validator, cb);
  } else if (eo === 'odd') {
    console.log(`${val} is odd`);
  }
  return cb();
}

firstOddValue(myArr, isEvenOdd, callback);

每当运行时(或编译器,取决于语言/上下文)接近另一个函数中的函数调用时,js 运行时都会暂停当前函数堆栈的执行,创建一个新的执行堆栈并运行新的执行堆栈,直到完成或返回一个值,之后它恢复之前的执行上下文,等等。

评论

0赞 InSync 9/16/2023
这并不能回答问题,该问题询问如何实现自制 .请参阅如何回答.every()
0赞 Stephen Arsenault 9/16/2023
实际上,它使用递归解析所有元素,并显示了使用回调的示例。他说他是新来的,我不久前是新来的,知道麻烦的地方。他不是在编写下一个谷歌,而是在学习概念,而不是api。不是所有的事情都是非黑即白的,不是每个人都知道如何以专业人士知道如何回答的方式表达他们的问题,以便他们理解。仅仅提到一种方法,并不能教任何东西。
0赞 InSync 9/16/2023
不过,这不是一个答案。它显示了一个高级递归函数的示例,是的,但它的作用与 完全不同。.every()
0赞 Alexander Nenashev 9/16/2023 #2

您可以使用遍历数组,如果回调返回虚假值,则立即返回 false。并不是说检查是否所有数组项都应该在回调中完成,而不是在 中完成。所有数组 filter/check 方法都使用从回调返回的 truey/false 值。在这里学习:for..truemyEvery

https://developer.mozilla.org/en-US/docs/Glossary/Falsy https://developer.mozilla.org/en-US/docs/Glossary/Truthy

另请注意,为了检查数组项是否为真/假,您可以使用它是布尔原语的包装对象的构造函数,然后用作真/假条件。Boolean()

let myEvery = function(arr, cb) {
   for(let i = 0; i < arr.length; i++){
      if (!cb(arr[i])) {
          return false;
      }
   }
   return true;
};

const arr = ['YOUR CASE: CHECKING IF ALL true',
() => myEvery([true, true, true, true, true], item => item === true),

'CHECKING true/false FROM CALLBACK',
() => myEvery([1, 1, 1, 0, 1], item => item === 1),

'CHECKING FALSY',
() => myEvery([1, 1, 1, 0, 1], item => item),

'CHECKING FALSY WITH ARRAY::EVERY()',
() => [1, 1, 1, 0, 1].every(item => item),

'CHECKING WITH BOOLEAN()',
() => myEvery([1, 1, 1, 0, 1], Boolean),

'CHECKING ALL TRUE',
() => myEvery([1, 1, 1, 1, 1], item => item === 1)];

for(let i = 0; i < arr.length; i+=2){
  console.log(arr[i]);
  console.log(arr[i+1].toString().slice(6));
  console.log(arr[i+1]());
}

以下是所发生情况的日志:

let myEvery = function(arr, cb) {
   for(let i = 0; i < arr.length; i++){
      const result = cb(arr[i]);
      console.log('result of callback for', arr[i], '=>', result);
      if (!result) {
          console.log('returning false');
          return false;
      }
   }
   console.log('all array items are ok, returning true');
   return true;
};

console.log(myEvery([1, 1, 1, 0, 1], item => item === 1));
console.log(myEvery([1, 1, 1, 1, 1], item => item === 1));