将map函数返回一个布尔值而不是布尔值数组

3
假设你有如下数组:
arrayExample = [1, 2, 3, 4, 5, 6, 7]

我想使用 map 函数遍历 arrayExample 数组,如果所有数字都小于 8,则返回 true,否则返回 false。但是,当我这样做时,我得到一个由 true 组成的数组(例如:[true, true, true ...等])。
我能否只返回一个值?
以下是我的代码:

var testBoolean = true;
var array = [1,2,3,4,5,6,7];

testBoolean = array.map(m => { 
    //if a number in the array is >=8, changes the testBoolean to false and return false only
    if(m >= 8) 
    { 
        return false;
    }
    //VS code said I had to have a return here, I believe its because I need to have in case m < 8 (edited after reading a comment)
    return true;
 })
 
 //prints an array [true,true,true,true,true,true,true]
document.write(testBoolean); 

我对 "map" 还有点陌生,但我相信它会为每个元素返回一个值,只是不确定如何使其返回 1 truefalse


这是应该用Java还是JavaScript?你明白它们并不是“一模一样”的。 - Stultuske
你需要第二个返回语句,以防 m < 8。 - Stultuske
@Stultuske JavaScript,抱歉我改了标签。那很有意义,谢谢你澄清! - webdesignnoob
3个回答

7

最简单的解决方案是使用.some()

我们不需要检查每个值,只需要找到第一个值不小于8。

const array = [1, 2, 3, 4, 5, 6, 7]
const testBoolean = !array.some(m => m >= 8)
console.log(testBoolean)


6

对于这种情况,.map() 不是正确的工具。 .map() 用于将数组中的所有元素转换为新元素(即:将每个元素映射到新的转换值)。因此,.map() 总是会返回一个数组(除非有意修改此行为)。相反,你可以使用 .every(),它会告诉你如果你的函数对于每个元素都返回 true,则所有元素都匹配你的条件(即:如果你的函数对于每个元素都返回 true,则你会得到 true 作为结果,否则你将得到 false)。.every() 方法会在找到回调函数返回 false 的第一个元素时提前终止执行,这可以提高效率:

const array = [1, 2, 3, 4, 5, 6, 7];
const testBoolean = array.every(m => {
  if (m >= 8) {
    return false;
  }
  return true;
});
console.log(testBoolean);

这段内容可以更加简洁地写成只返回m < 8的结果(该表达式会评估为truefalse)。

const array = [1,2,3,4,5,6,7];
const testBoolean = array.every(m => m < 8);
console.log(testBoolean);


@NickParsons,我强烈建议使用.some()以获得更好的性能,因为不需要检查每个值。 - ecoplaneteer
1
@DevMaster every 也像 some 一样可以进行短路处理。 - adiga
@DevMaster 正如adiga所指出的那样,.every()并不总是检查每个值,它会像.some()一样提前终止。一旦every()找到一个为false的值,它就会停止并返回false。.some()则相反,一旦它找到一个为true的值,它就会停止并返回true。但如果它从未找到任何返回true的值,则需要迭代整个数组。 - Nick Parsons
@DevMaster 感谢您提供使用 .some() 的另一种选项。由于我正在处理的项目需要检查每个元素,所以我选择了Nick的选项。虽然与我举的例子有些不同,但是思路相同! 不过我会记住 .some() 函数的。再次感谢你们两位! - webdesignnoob
1
@DevMaster 你可以轻松地验证它:你可以运行 [1,2,3,4,5].every(a => { console.log(a); return a < 3 }) 或者使用逗号运算符 [1,2,3,4,5].every(a => (console.log(a), a < 3) )。它只会记录直到 3。一旦不满足条件,它就不需要继续检查了。 - adiga

1

从更一般的角度来看,如果你想要从一个数组中返回单个值,.reduce() 是你的好朋友。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

具体针对您的情况,您可以这样做:
array.reduce(function(accumulator, currentVal, i, arr) {
  return accumulator && currentVal < 8;
}, true));
< p >所以.reduce()使用初始值true遍历您的数组,并返回“前一个”值(累加器)和当前值是否小于8。

您可以将其视为

(true && (a [0]<8 &&(a [1]<8 ...)))

每次迭代返回的值都成为下一个的accumulator。通过这种方式,您不仅可以进行数学运算,还可以将某个形状的数组(例如,{w:0,h:0}对象的数组)更改为另一种输出(例如,单个数字是所有通过每个wh计算的斜边之和)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接