js判断数组是否包含某个元素,自己写了个函数,不知哪出了问题?

Codermin
  • 593
var arr = [
    {
        id:1,
        name:"mincoo"
    },
    {
        id:2,
        name:"tomorrow"
    }
];
//参数:(要检测的数组,要检测的字段,要检测哪个key)
function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
        if(arr[i].keyName == value){
            return false; //发现含有此元素
        }
        else{
            return true; //没有找到
        }
        console.log(arr[i].keyName); 
    }
}
isContainKey(arr,"tomorrow","name");

我想要的效果:
如果检测到这个数组包含此元素,返回true,否则返回false。
但是我这里写的白屏了,是什么原因呢?

回复
阅读 2.8k
6 个回答
改名字很伤神
  • 7.9k
✓ 已被采纳

你这是找数组第一个的对象的叫keyName属性等不等于value

function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
        if(arr[i][keyName] == value){
            return true; //发现含有此元素
        }
    }
    return false;
}

其次为何要写着方法,不本来就有么。

arr.some(({ name }) => name === 'tomorrow' )

楼上已经说明了原因所在。
这就像 官兵抓逃犯,假设逃犯藏在某个居民家中。官兵敲了一家居民甲的门,问逃犯在你家吗。如果恰好在呢,那么抓捕成功,如果不在呢,就要接着去敲下一家乙的门,对不对。你这里写了一个return,直接宣告抓捕失败,打道回府了。

krun
  • 6.9k

四处问题:

function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
        // 这里应该是 arr[i][keyName],你的写法会去找元素的 'keyName' 属性
        if(arr[i].keyName == value){
            return false; //发现含有此元素 // 按照你的题意,这里应该返回 true 的。
        }
        else{
            return true; //没有找到 // 按照你的题意,这里应该返回 false 的。
        }
        // 你让两个分支都包含 return 了,这意味着这个循环最多只能循环一次
        console.log(arr[i].keyName); 
    }
}

应该改为:

function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
        if(arr[i][keyName] === value){
            console.log(arr[i].keyName); 
            return true; //发现含有此元素
        }
    }
    return false;
}
leezii
  • 455

你写这个只循环了一次

function isContainKey (arr, key, value) {
  return arr.some(v => {
    return v[key] === value
  })
}

两个问题:

  1. keyName应当写在防括号内,你写在.后面,程序把他当做了下标;
  2. 只有在检测到这个元素时,才在for循环内执行return,另一个return应当在for循环的外面,你的程序是只能检测第1个元素是否匹配,然后返回true和false;

还有,你这里既然是检测数组里的某项是否包含这个数组,如果检测到的话,应该返回true呀,可是你为什么想要返回false呢?

var arr = [
    {
        id:1,
        name:"mincoo"
    },
    {
        id:2,
        name:"tomorrow"
    }
];
//参数:(要检测的数组,要检测的字段,要检测哪个key)
function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
        if(arr[i][keyName] == value){
            return true; //发现含有此元素
        }
    }
    return false;
}
console.log( isContainKey(arr,"tomorrow","name") );

你在for循环中写了两个return语句,当第一次循环进入的时候,不管对象中是否存在你所需要判断的key值,你都跳会出这个循环,并且不再执行后续操作,你将一个return移到for循环外就可以了。当然你最好是key值存在的时候返回true,因为你的方法名是isContainKey,还有一点,对于这种函数方法你写几个console.log打印下就可以测试出来的,所以你最好自己多测试一下

function isContainKey(arr,value,keyName){
    for(var i=0;i<arr.length;i++){
      console.log(arr[i])
        if(arr[i].keyName == value){
            return true; //发现含有此元素
        }
    }
    return false
}
宣传栏