判断数组中是否有重复的元素且不能有指定的重复元素?

新手上路,请多包涵

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循环来实现。

阅读 3k
6 个回答
let arr = [false,false,true,true,false]
const result = arr.reduce((a,b) => a + b);
const str = result == 1 ? '通过' : result > 1 ? '多个true' :`没有true` 
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 的条件可以这样理解:

  1. 如果 value 是 true,++count,否则不增加计数
  2. 计数结果跟 2 比较

这里情况比较特殊,因为数值比较的时候,false 会当作 0,true 会当作 1,两个都符合 <2 的条件,所以条件还可以简化成 (value && ++count) < 2 。这里之所以选择 ?: 表达式,主要是因为 ❶ 好懂一些,❷ 更普适一些(如果不是 boolean 型,比如 string,&& 表达式就不好用了)

如果元素只有 truefalse,问题就变成数组中有且必须只有一个 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'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题