比较对象之间的是否相同
今天在做项目的时候,遇到一个问题就是删除一个Array里面某个位置的数据,之后查询了一下网上的写法,基本就是使用一个Array自己带的一个方法,splice方法和delete方法,二者的区别,就是一个直接改变原先的数组长度,一个不改变,splice里面有两个参数,一个是下标,一个是长度,就是删除这个下标后面的几个数据,之后会改变原先的数据长度,之后delete主要是删除数据,但是不改变原先的数据长度,利用undefined来进行占位。我用的是splice这个方法,但是在获取下标的时候,在再用indexOf的时候,获取到的基本都是基本数据类型可以获取到位置,比如,string,number等,但是要是object的时候,就一直都是-1。所以就在网上找了一个方法,但是这个方法经过测试,只能判断基本类型,string,number,undefined,null,object,复杂的数据类型就判断不了了,比如在object里面在嵌套一个object,或者是Array,就不可以了,但是可以根据自己的需求,根据既定的object结构,进行添加算法和判断。
下面是demo和结果,里面添加了array的获取下角标以及其中的删除方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>text</title>
</head>
<body>
<script>
//只能判断简单是数据类型和其中的结构
var cmp = function( x, y ) {
/*
判断两个数据的基本类型,null,undefined,string,nummber,是不是这四个基本类型,
要是这四个基本类型,利用===进行比较,直接可以判定,二者相同;
*/
if ( x === y ) {
return true;
}
/*
分别判断,二者是不是objct的类型数据,如果二者有一个不是object,则二者不相同
*/
if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
return false;
}
/*
constructor 属性返回对创建此对象的数组函数的引用。
如果二者的函数引用不相同,则判定,二者不相同,
*/
if ( x.constructor !== y.constructor ) {
return false;
}
/*
对其进行迭代的数据处理
*/
for ( var p in x ) {
/*
判断实体里面有没有这个属性
*/
if ( x.hasOwnProperty( p ) ) {
// 如果另一个实体里面没有这个属性,则直接返回不相同
if ( ! y.hasOwnProperty( p ) ) {
return false;
}
// 比较两者的值,是不是相同,要是相同,则直接跳到下一个属性
if ( x[ p ] === y[ p ] ) {
continue;
}
// 判断如果属性值不是object,则返回false
if ( typeof( x[ p ] ) !== "object" ) {
return false;
}
}
}
for ( p in y ) {
//遍历另一个实体里面的属性,判断x实体里面的属性有没有
if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
return false;
}
}
return true;
};
var array = new Array();
array.push({"name":"小明"});
array.push({"name":"小绿"});
array.push({"name":"小白"});
array.push({"name":"小黑"});
array.push({"name":"小红"});
//自己定义的获取到下标的方法
Array.prototype.indexCmpOf = function(value){
for(var i =0;i<this.length;i++){
if(cmp(this[i],value)){
return i;
}
}
return -1;
}
Array.prototype.removeSplice = function(index,number){
if(index>-1&&number<=this.length){
this.splice(index,number);
}
}
var a = {"name":"小红"};
var b = {"name":"小红"};
var c = {"name":"小红","id":123};
console.log(cmp(a,b),cmp(a,c));
console.log(array.indexCmpOf(a));
console.log(array.indexCmpOf(c));
console.log(array.removeSplice(array.indexCmpOf(a),1))
</script>
</body>
</html>