Javascript中常见的逻辑题和解决方法  

一、统计数组 arr 中值等于 item 的元素出现的次数

  • function count(arr, item) {
  •    var count = 0;
  •    arr.forEach(function(e){
  •      //e为arr中的每一个元素,与item相等则count+1
  •      e == item ? count++ : 0;
  •    });
  •    return count;
  •  }

  • function count(arr, item) {
  •   return arr.filter(function(a){
  •     return (a==item);
  •   }).length
  • }

  • function count(arr, item) {
  • var res;
  • return (res = arr.toString().match(new RegExp("//b"+item+"//b","g")))?res.length:0;
  • }

  • function count(arr, item) {
  •       var count = 0;
  •       arr.map(function(a) {
  •         if(a === item) {
  •           count++;
  •         }
  •       });
  •       return count;
  •     }

二、为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组

  • function square(arr) {
  •   return arr.map(function(item,index,array){
  •     return item*item;
  •   })
  • }

  • function square(arr) {
  •   //声明一个新的数组存放结果
  •    var a = [];
  •    arr.forEach(function(e){
  •      //将arr中的每一个元素求平方后,加入到a数组中
  •      a.push(e*e);
  •    });
  •    return a;
  •  }

  • function square(arr) {
  • //复制一个arr数组
  •   var newarr = arr.slice(0);
  •   for (var i=0;i<newarr.length;i++){
  •     newarr[i]= newarr[i]* newarr[i];
  •   }
  •   return newarr;
  • }

  • function square(arr) {
  •   return arr.map(function(item){
  •     return Math.pow(item, 2);
  •   })
  • }

三、将数组 arr 中的元素作为调用函数 fn 的参数

  • function argsAsArray(fn, arr) {
  •  return fn.apply(this, arr);
  •  }

  • function argsAsArray(fn, arr) {
  •   return function(para1,para2){ 
  •     return para1.apply(this,para2);
  •   }(fn,arr);
  • }

四、完成函数 createModule,调用之后满足如下要求:

1、返回一个对象

2、对象的 greeting 属性值等于 str1,name 属性值等于 str2

3、对象存在一个 sayIt 方法,该方法返回的字符串为 greeting属性值 + ‘, ‘ +name属性值

  • function createModule(str1, str2) {
  •    var obj = {
  •      greeting : str1,
  •      name   : str2,
  •      sayIt  : function(){
  •        //两个属性前面都需要加上this
  •        return this.greeting+", "+this.name;
  •      }
  •    };
  •    return obj;
  •  }

  • //使用构造函数法
  • function createModule(str1, str2) {
  •   function Obj(){
  •     this.greeting = str1;
  •     this.name = str2;
  •     this.sayIt = function(){
  •       return this.greeting + ', ' + this.name;
  •     };
  •   }
  •   return new Obj();
  • }

  • //构造函数与原型组合
  • function createModule(str1, str2) {
  •   function CreateMod(){
  •     this.greeting = str1;
  •     this.name = str2;
  •   }
  •   CreateMod.prototype.sayIt = function(){
  •     return this.greeting + ', ' + this.name;
  •   }
  •   return new CreateMod();
  • }

五、已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:

1、返回一个函数 a,a 的 length 属性值为1(即显式声明 a 接收一个参数) 

2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1 

3、调用 b之后,返回一个函数 c, c 的 length 属性值为 1

4、调用 c 之后,返回的结果与调用 fn 的返回值一致

5、fn的参数依次为函数 a, b, c 的调用参数

输入例子:

  • var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
  • function curryIt(fn) {
  •    //获取fn参数的数量
  •    var n = fn.length;
  •    //声明一个数组args
  •    var args = [];
  •    //返回一个匿名函数
  •    return function(arg){
  •      //将curryIt后面括号中的参数放入数组
  •      args.push(arg);
  •      //如果args中的参数个数小于fn函数的参数个数,
  •      //则执行arguments.callee(其作用是引用当前正在执行的函数,这里是返回的当前匿名函数)。
  •      //否则,返回fn的调用结果
  •      if(args.length < n){
  •       return arguments.callee;
  •      }else return fn.apply("",args);
  •    }
  •  }

  • function curryIt(fn) {
  •   return function a(xa){
  •     return function b(xb){
  •       return function c(xc){
  •         return fn.call(this,xa,xb,xc);
  •       };
  •     };
  •   };
  • }

六、数组中输出元素位置

  • function indexof(arr,item){
  •   for(var i = 0,len = arr.length;i<len;i++){
  •     var ite = arr[i];
  •     if(ite == item){
  •       console.log(ite == item);
  •       return i;
  •     }else{
  •       return -1;
  •     }
  •   }
  • }

  • function indexof(arr,item){
  •   return arr.indexOf(item);
  • }

七、数组求和

  • function sum(arr) {
  •   return eval(arr.join("+"));
  • };

八、删除给定元素

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

  • function remove(arr, item) {
  •   var newA=arr.slice(0);
  •   for(var i=newA.indexOf(item);i>-1;i=newA.indexOf(item)){
  •     newA.splice(i,1);
  •   }
  •   return newA;
  • }

总结

Javascript中常见的逻辑题就总结到这了,不知道大家都学会了吗?本文的内容对大家的学习或者工作还是有一定帮助的,如果有疑问大家可以留言交流,谢谢大家的支持。