let arr = [false,false,true,true,false]
PS:arr这个数组是变化的
1.当arr数组中有一个true,多个false的时候提示通过。
2.当arr数组中有多个true和多个false的时候提示true不能有多个。
3.当arr数组中有多个false但是没有true的时候提示该数组中没有true,请添加一个true。
最好用简单的for循环来实现。
let arr = [false,false,true,true,false]
PS:arr这个数组是变化的
1.当arr数组中有一个true,多个false的时候提示通过。
2.当arr数组中有多个true和多个false的时候提示true不能有多个。
3.当arr数组中有多个false但是没有true的时候提示该数组中没有true,请添加一个true。
最好用简单的for循环来实现。
let arr = [false,false,true,true,false]
let res = ''
let trueNum = 0
for(let item of arr){
if(item === true){
trueNum++
}
}
if(trueNum === 0){
res = '没有true'
}else if(trueNum > 1){
res = 'true不能有多个'
}else{
res = '通过'
}
console.log(res)
function check(arr) {
var ret = "该数组中没有true,请添加一个true";
for (var i = 0, j = i; i < arr.length && j <= 1; ++i) {
if (arr[i]) ret = j++ ? "true不能有多个" : "通过";
}
return ret;
}
console.dir(check([false, false, true, true, false]));
这个问题,其实跟 false 没啥关系,结果主要取决于 true 的数量,所以计算出 true 的数量就好了
一般计算数量、合计可能都会想到用 reduce,就是 @zzgzzg00 的回答。
不过像这种计数也可以用 filter 来完成,如:
function predicate(list) {
const trueCount = list.filter(value => value).length;
if (trueCount === 1) {
return "通过";
} else if (trueCount === 0) {
return "请添加一个 true";
} else {
return "true 不能有多个";
}
}
其实要判断有多个 true 存在的情况其实是不需要遍历完的。当然元素少的时候是否遍历完差别不大,但元素数量特别大的时候,不遍历完还是有一定的性能优势。Array 实例方法中,every 和 some 都可以用于不完全遍历
function predicate(list) {
let count = 0;
if (list.every(value => (value ? ++count : count) < 2)) {
return count === 1 ? "通过" : "请添加一个 true";
} else {
return "true 不能有多个";
}
}
上例中 every 的条件可以这样理解:
++count
,否则不增加计数这里情况比较特殊,因为数值比较的时候,false 会当作 0,true 会当作 1,两个都符合 <2
的条件,所以条件还可以简化成 (value && ++count) < 2
。这里之所以选择 ?:
表达式,主要是因为 ❶ 好懂一些,❷ 更普适一些(如果不是 boolean 型,比如 string,&&
表达式就不好用了)
如果元素只有 true
和 false
,问题就变成数组中有且必须只有一个 true
。
const arr = [false,false,true,true,false];
// 迭代,简单高效
let finded = false;
for(const [index, flag] of arr.entries()){
if(flag === true){
if(finded){
// 多个true
console.error(`[index:${index}]重复的true`);
break;
} else {
finded = true;
}
}
}
if(!finded){
console.error('没有一个true');
}
// indexOf
let index = arr.indexOf(true);
if(index < 0){
console.error('没有一个true');
} else {
// 如果不在意重复的第一个位置的话,常规做法
let repeatIndex;
if((repeatIndex = arr.lastIndexOf(true)) !== index){
console.error(`[index:${repeatIndex}]重复的true`);
}
// 如果在意重复的第一个位置的话
for(const total = arr.length; index < total; index++){
}
}
换一种思路,使用正则也是可以的~
let arr = [false,false,true,true,false]
const length = arr.join('').match(/true/g).length
const str = length > 1 ? '多个true' : length == 1 ? '一个true' : '没有true'
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决