提问人:Royce James Calvin 提问时间:9/16/2023 最后编辑:Royce James Calvin 更新时间:9/18/2023 访问量:55
无法弄清楚如何使用 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
问:
我不确定如何检查回调的每个元素并检查它们是否都为真;我也很陌生,尝试编码,如果它看起来很糟糕,很抱歉。
编写一个接受数组和回调作为参数的函数。
该函数应返回一个布尔值,指示
数组在传递到回调时返回 true。
不要使用内置的 Array#everymyEvery
let myEvery = function(arr, cb) {
let bool = false;
if (cb(arr) === true) {
bool = true;
}
return bool;
};
答:
在这种情况下,应该使用@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 运行时都会暂停当前函数堆栈的执行,创建一个新的执行堆栈并运行新的执行堆栈,直到完成或返回一个值,之后它恢复之前的执行上下文,等等。
评论
.every()
您可以使用遍历数组,如果回调返回虚假值,则立即返回 false。并不是说检查是否所有数组项都应该在回调中完成,而不是在 中完成。所有数组 filter/check 方法都使用从回调返回的 truey/false 值。在这里学习:for..
true
myEvery
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));
评论