zoukankan      html  css  js  c++  java
  • Javascript刷题 》 查找数组元素位置

    找出元素 item 在给定数组 arr 中的位置

    输出描述:

    function indexOf(arr, item) {
      .....
    }
    

    如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1

    输入例子:

    indexOf([ 1, 2, 3, 4 ], 3)
    

    输出例子:

    2
    

    实现方法

    1、先将arr转换成字符串,然后使用字符串的indexOf
    function indexOf(arr, item) {
      return arr.join("").indexOf(item);
    }
    
    2、直接使用数组的indexOf
    function indexOf(arr, item) {
      return arr.indexOf(item);
    }
    
    3、使用for循环
    function indexOf(arr, item) {
      for(let [i,x] of arr.entries()){
        if(x===item)return i;
      }
      return -1;
    }
    

    判断当前项是否等于传进来的那一项,如果到最后一项都没有找到,则返回-1

    4、使用findIndex方法
    function indexOf(arr, item) {
      return arr.findIndex(value=>value===item);
    }
    
    5、将传进来的值当做数组分割符
    function indexOf(arr, item) {
      var newArr = ("," + arr.toString() + ",").split("," + item + ",");
      if(newArr.length<=1){
        return -1;
      }
      var index = newArr[0].split(",").length-1;
      return index;
    }
    

    这个方法虽然复杂了点,但很有趣,会用前面的几个方法顶多算是对api还算了解,但这个更多的是靠编程能力。

    其实一开始比较简单的,没有这么复杂,但有个小bug,所有到后面就变的复杂了些,讲一下这题的原理。

    如果我们将传进来的值当成一个分割符会是什么效果?

    1、先将这个数组转换成字符串

    [1, 2, 3].toString(); //1,2,3
    

    2、用传进来的那个值当作字符串分割符,切成数组

    function indexOf(arr, item) {
      return arr.toString().split(item);
    }
    
    console.log(indexOf([1, 2, 3],2)) //["1,", ",3"]
    
    

    会被切成两份,而["1,",]的第二位就是我们需要的索引,因此

    arr.toString().split(item)[0] //1,
    

    我们再将这个1, 转换成数组,其中的数组长度-1就是我们要的索引。

    arr.toString().split(item)[0].split(",").length-1
    

    虽然看似完成了,但还有一些bug得解决,如果没有找到呢?

    3、解决如果找不到

    怎么知道找不到呢?如果说当前的这个值用做分割后,这个数组的长度和之前的一样长,或者长度为1,那不就是找不到吗,那我们可以这样

    function indexOf(arr, item) {
      var newArr = arr.toString().split(item); //如果长度为1说明数组没有被分割掉值
      if(newArr.length<=1)return -1;
      return newArr[0].split(",").length-1;
    }
    
    console.log(indexOf([1, 2, 3],5)) //-1
    

    以及完成了一部分了,但还有个bug,一开始没有考虑到的,比如这个数组是一个多位,而查找的值为单个,那么肯定就会出现问题的,如下

    console.log(indexOf([12, 2, 3],1)) //0
    

    导致这个结果的问题是,[12,2,3]转换成字符串后是12,2,3将1当作分割符自然能找到12里面的那个1,解决这个问题,就得动点脑了,首先我们需要解决的问题是,防止12被当作1来查找。我们可以在当前这个值前后添加一个值,如下

    如查找

    12,2,3
    

    我们可以这样

    ,12,2,3,
    

    也就是说把12给包围住,查找的时候,我们将当前的这个值前后也加上","那么它们就是一个整体了。

    因此最后就成了如下的这段代码

    function indexOf(arr, item) {
      var newArr = ("," + arr.toString() + ",").split("," + item + ",");
      if(newArr.length<=1){
        return -1;
      }
      var index = newArr[0].split(",").length-1;
      return index;
    }
    
    console.log(indexOf([122, 2, 3],12)) //-1
    
  • 相关阅读:
    标签最低高度设置minheight不兼容
    字体综合属性(font)写法顺序为
    让IE6、IE7、IE8支持CSS3的圆角、阴影样式
    微信小程序3D轮播图
    微信小程序左滑删除
    android ble 蓝牙4.0开发日志(四)
    Windows邮件服务器hMailServer,网页前端访问平台Webmail搭建
    邮件服务器hMailServer管理工具hMailServer Administrator汉化
    蓝牙设计
    Windows下搭建免费、开源的邮件服务器hMailServer
  • 原文地址:https://www.cnblogs.com/pssp/p/6130883.html
Copyright © 2011-2022 走看看