在 数组中 是否存在 的问题?!

211 阅读2分钟

鉴于项目中经常用到数组数据,所以对数组的处理尤其频繁。

在项目中最常见的是 输入一个标签,把标签添加到 已添加标签的标签数组,如果已添加标签组中存在 则提示“已经存在”  此时应该不添加。如果标签组不存在,则添加入标签组并提示添加成功;


eg:输入   a=“新标签”

已添加标签组  tagsAdded=[‘第一项’,“第二项”,....];

a 数据要不要添加到  数组  。可以用$.inArray 方法  如果不存在 即添加;


再把问题升级一下:


eg:输入 a=“新标签”

已添加标签组 tagsAdded=[{  

     name:“第一项”

},{

    name:“第二项”

}.];

如果是  新输入的a,看是否跟数组每一项name属性是否一致;$,inArray 此时已经不能使用;

不过我们可以简单的遍历一下

arr.some(function(item){
return item.name==a;
})

如此可以根据返回值判断是否存在;


如果是2个数组的对比呢

eg:    var c=[1,2,3]

     var d=[1,2,3,4]

比较c 数组在d数组中存在与否的差异化处理;

此时需要2层遍历;存在的如何处理,不存在的如何处理。

如果出现以下情况

eg:var a=[{a:0},{a:2}]

var b=[1,2,3]

复杂度更加提升;

作为一个程序员,每天要面对大量的代码。如果把所有的都用来处理基本的数组问题,势必会拖慢项目的进程。我提倡我们应该把主要的经历放在业务层,这些基础功能问题应该封装成方法。遇到调用即可;

为了解决数组对比的问题;

我封装了如下方法:

$.extend({
comArr:function(){
var arr=[].slice.call(arguments,0);
var com_A=typeof arr[0]=='object'&&arr[0] instanceof Array==true?arr[0]:false;
var com_B=typeof arr[2]=='object'&&arr[2] instanceof Array==true?arr[2]:false;

if(!com_A||!com_B) return;

var a_length=com_A.length;
var b_length=com_B.length;

var a_single;
var b_single;

var a_pro=arr[1]===true?true:false;
var b_pro=arr[3]===true?true:false;

var com={a:[],b:[]};
for( var i=0;i<a_length;i++ ){
    a_single=a_pro?com_A[i]:com_A[i][arr[1]];
        for(var l=0;l<b_length;l++){
            b_single=b_pro?com_B[l]:com_B[l][arr[3]];
            if(a_single==b_single){
            com.a=com.a.concat(com_A.splice(i,1));
           com.b=com.b.concat(com_B.splice(l,1));
            l--,i--,a_length--,b_length--;
            continue;
        }
    }
}

return [com.a,com.b,com_A,com_B];
}
});


使用:

var a=[{a:0},{a:2}]
var b=[1,2,3]

var x=$.comArr(a,“a”,b,true);


传入的4个值 依次为  a数组,a数组要比较的属性,b数组,b数组要比较的属性;

如果比较的是数组的每一项;则传入 true;


为了更好的说明项的比较:如下
var a=[1,2,3]
var b=[1,2,3,4]
var x=$.comArr(a,true,b,true)


返回值 x  为一个数组 格式为:[a数组中与b数组相同的项,b数组与a数组相同的项,a数组中与b数组中不同的项,b数组与a数组不同的项]

如上 x=



注:应为我遇到的比较大部分是字符串的比较,所以只处理了字符串;

返回的数组可以任意拼接处理更灵活;

如果发现错误请给予提示,不胜感激;

预祝各位成功;