[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]

源代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值