牛客刷题(常更)

2019-10-12

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

function indexOf(arr, item) {
  //先判断当前浏览器是否支持indexOf方法
  if (Array.prototype.indexOf){
      return arr.indexOf(item);
  } else {
      for (var i = 0; i < arr.length; i++){
          if (arr[i] === item){
              return i;
          }
      }
  }     
  return -1; //总是把return -1暴漏在最外层
}

2.计算给定数组 arr 中所有元素的总和2.1 普通玩家版

function sum(arr) {
    let res = 0;
    for(let i=0;i<arr.length;i++){
        res += arr[i];
    }
    return res;
}

2.2 forEach版本

function sum(arr) {
    let res = 0;
    arr.forEach(function (curr,index,arr) {
        res += curr;
    });
    return res;
}
console.log(sum([1, 2, 3, 4, 5])); //15

注意点:forEach() 为每个数组元素执行callback函数;不像 map() 或者 reduce(),它总是返回 undefined 值,并且不可链式调用。

function sum(arr) {
    let res = 0;
    arr.forEach(function (curr,index,arr) {
        return res += curr;
    });
}
console.log(sum([1, 2, 3, 4, 5])); //返回undefined

2.3 ES6玩家版

function sum(arr) {
    return arr.reduce((prev,curr) => prev + curr,0)
}
//调试部分
console.log(sum([1, 2, 3, 4])); //10

3.移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组3.1 菜鸡(我写的)版本 如果数组中的元素不和item相等,把数组元素添加到新的数组中

function remove(arr, item) {
    let res = [];
    for(let i=0;i<arr.length;i++){
        if(arr[i] !== item){
            res.push(arr[i]);
        }
    }
    return res;
}

3.2 菜鸡版本的另一种实现 如果数组中的元素和item相等,就不再往下执行代码

function remove(arr, item) {
    let res = [];
    for(let i=0;i<arr.length;i++){
       if(arr[i] === item) continue;
       res.push(arr[i]);
    }
    return res;
}

3.3 slice&splice混用

  • 题意要求不要直接修改数组arr,结果返回新的数组;slice()方法可用于截取字符串,且返回的是截取内容(新的数组),我们可以传递参数0截取全部元素
  • 不可以直接使用赋值的方式拷贝一个数组,会导致更改一个数组的元素另外一个数组也会跟着改变的情况
  • 在新的数组上进行操作,利用splice()切割数组,splice()会改变原数组
function remove(arr, item) {
    let newArr = arr.slice(0); //
    for(let i=0;i<newArr.length;i++){
        if(newArr[i] === item){
            newArr.splice(i,1);
            i--;
        }
    }
    return newArr;
}

3.4 ES6玩家版(别人写的) filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。返回 返回true的项组成的数组

function remove(arr,item){
    return arr.filter(ele => ele !== item);
}

4.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回4.1 直接在给定的数组上操作,则可以使用splice()方法,注意splice()方法删除元素后,数组长度也变化了,需要执行i--避免跳过元素。

function removeWithoutCopy(arr, item) {
    for(let i=0;i<arr.length;i++){
        if (arr[i] === item){
            arr.splice(i,1);
            i--;
        }
    }
    return arr;
}

4.2 倒着删除,不用考虑数组长度变化

function removeWithoutCopy(arr, item) {
    for(let i=arr.length-1;i>=0;i--){
        if(arr[i] === item){
            arr.splice(i,1);
        }
    }
    return arr;
}
原文链接:segmentfault.com

上一篇:剖析setTimeout和click点击事件的触发顺序
下一篇:JavaScript 小知识, 加没加 prototype , 用法大不同
相关教程
关注微信

扫码加入 JavaScript 社区

相关文章

首次访问,需要验证
微信扫码,关注即可
(仅需验证一次)

欢迎加入 JavaScript 社区

号内回复关键字:

回到顶部