zoukankan      html  css  js  c++  java
  • [javascript]删除指定数组中指定的元素

    已知一个数组,我们想用指定的方法对数组中的元素进行逐一操作。
    函数如下:

    foreach = function (obj, insp){
      if(obj== null && obj.constructor != Array){
      return [];
    }
    //obj是要处理的数组,obj==null 表示对象尚未存在;obj.constructor != Array 表示对象obj的属性的构造函数不是数组;
    //constructor属性始终指向创建当前对象的构造函数。两个条件均满足,则返回空数组[];

    //下面对constructor属性作进一步了解。
    var obj= [1, 2, 3, 4]; // 等价于 var obj= new Array(1, 2, 3, 4);
    console.log(obj.constructor === Array); // 返回true 表明obj的构造函数为Array;

    var foo= function() { }; // 等价于 var foo = new Function();
    console.log(foo.constructor === Function); // 返回true 表明foo的构造函数为Function;

    var obj = new Foo();  //由构造函数实例化一个obj对象 
    console.log(obj.constructor === Foo); // 返回true 表明obj的构造函数为Foo;

    -----------------------------------------------------------------------------------------------------------

    var i=0, len = obj.length, r = [];
    while(i<len){
      var x = insp(obj[i], i);
      if (x !== null) {
      r[r.length] = x;
      }
     i++;
    }
    return r;
    };
    //对数组对象obj进行遍历,参数insp代表一个方法或函数,用于对obj中的每个元素进行操作。给参数insp传递了两个参数,obj[i]代表数组中的每一个元素值;并将函数参数insp赋给x,最终将x值赋给数组r。

    -----------------------------------------------------------------------------------------------------------

    比如我们要遍历数组中的每一个元素,引用foreach函数
    var testArray = [1,2,3,4,5,1,2,'w'];
    foreach(testArray, function(i){
      alert(i)
    });

    -----------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------

    我们用另一个函数来删除指定数组中指定的元素
    ArrayWithout = function(){
      if (arguments.length < 2) {

    // Arguments 是特殊的对象,代表函数的参数.
        return arguments.length == 1 ? arguments[0] : null;
      }
       var results = [];
       var aa = arguments[0];

     //将第一参数赋给数组aa;
       if (aa === null || aa.constructor != Array) {
        return null;

    //如果aa不存在或者不是数组,那么返回null;
       }
      if(arguments[1].constructor == Array){

     // 如果第二个参数是数组,则将参数数组中对应的每个元素都删除;
        var args = [];
        args[0] = aa;

    //aa = arguments[0] 将aa赋给数组args,作为其第一个元素值;
        foreach(arguments[1], function(v, i){

     //引用了函数foreach,来对数组arguments[1]中每个元素进行操作,
          args[i+1] = v; 

    // v代表数组arguments[1]中每个元素值,将它们一一赋值给args[1],args[2]...,而args[0]=arguments[0];
         });
       }
       else{
        args = arguments;

     //如果第二个参数不是数组,则直接将参数数组赋给args;
       }
      for(var i = 0;i < aa.length; i ++){
        var isWithout = true;
          for(var j = 1; j < args.length ; j ++){
            if(aa[i] == args[j]){
                isWithout = false;
                  break;

        // 切记j是从1开始的,因为args的第一元素args[0]是arguments[0],正是我们要处理的的原数组,等同于数组aa;
         让要删除的各个元素与原数组aa中的某一元素进行逐次比较,如果相同,break 跳出循环; isWithout返回false,所以也不再执行下面的 results.push(aa[i]); 
               }
             }
         if (isWithout) {
           results.push(aa[i]); 

            //所谓删除原理,就是将原数组各元素与要删除的元素进行比较,保留与要删除的元素不相同的元素并赋给一个新的数组results;
          }
       }
      return results;  

     //返回已经删除了指定元素的数组;
    };

    // 引用ArrayWithout的例子
    var testArray = [1,2,3,4,5,1,2,'w'];
    var result = ArrayWithout(testArray, 1, 3);
    //var result = ArrayWithout(testArray, [1, 4]);
    alert(result) //[2,4,5,2]

    源代码如下:

    foreach = function (obj, insp){
        if(obj == null && obj.constructor != Array){
            return [];
        }
        var i=0, len = obj.length, r = [];
        while(i<len){
            var x = insp(obj[i], i);
            if (x !== null) {
                r[r.length] = x;
            }
           i++;
        }
        return r;
    };
    ArrayWithout = function(){
        if (arguments.length < 2) {
            return arguments.length == 1 ? arguments[0] : null;
        }
        var results = [];
        var aa = arguments[0];
        if (aa === null || aa.constructor != Array) {
            return null;
        }
        if(arguments[1].constructor == Array){
            var args = [];
            args[0] = aa;
            foreach(arguments[1], function(v, i){
                args[i+1] = v;
            });
        }
        else{
            args = arguments;
        }
        for(var i = 0;i < aa.length; i ++){
            var isWithout = true;
            for(var j = 1; j < args.length ; j ++){
                if(aa[i] == args[j]){
                    isWithout = false;
                    break;
                }
            }
            if (isWithout) {
                results.push(aa[i]);
            }
        }
        return results;
    };
    var testArray = [1,2,3,4,5,1,2];
     foreach(testArray, function(i){
     alert(i)
     })
    var result = ArrayWithout(testArray, 1, 3);
    //var result = ArrayWithout(testArray, [1, 3]);
    alert(result)	//[2,4,5,2]
    
  • 相关阅读:
    中断向量表
    lua绑定C++对象—luna模板
    lua对象调用—用 "." 与 ":" 调用表中函数时的区别
    FreeSWITCH 实现 双线路呼叫(主备线路)
    [转]Freeswitch在阿里云服务器语音不通问题小记(FS的NAT穿越穿透)
    [转]签发使用自签发证书--指定使用多域名、泛域名及直接使用IP地址
    [转]FreeSwitch启用WEBRTC小记
    [转]FreeSwitch1.10版本安装及内置mariadb(mysql)使用记录
    FreeSWITCH 使用 lua 脚本 接管 分机注册,鉴权等
    sip客户端NAT注册和拨打FreeSWITCH ,FreeSWITCH 会发到 sip客户端内网地址的问题
  • 原文地址:https://www.cnblogs.com/fengfan/p/1952552.html
Copyright © 2011-2022 走看看