JS基础测试29期(js对象,数组相关)

简答题:

1.已知纯对象:

1
2
let obj1 = { a: 1, b: 2 };
let obj2 = { a: 1, b: 2 };

1 我们都知道,obj1 == obj2 返回的值是 false,下面请写一个方法,如果键值对都是一样的(只需要原生相等),则认为两个对象是相等的.例如:

1
2
3
4
let obj1 = { a: 1, b: 2 };
let obj2 = { a: 1, b: 2 };

equalObject(obj1, obj2); //返回true

已知数组:

1
2
let arr1 = [1, 2, 5, 7, 9];
let arr2 = [1, 2, 5, 7, 9];

2.大家都知道,arr1 == arr2 返回的是 false,下面写一个方法,如果数组项都是一样的,(只需考虑原生相等)则认为两个数组是相等的.例如:

1
2
equalArray([1, 2], [2, 1]); //返回true
equalArray([1, 2], ["1", "2"]); //返回false

3.本题加大难度,相当于 1,2 题目的组合,请实现一个方法,只要内容形态一致,则认为数组或者对象相等.例如:

1
2
3
4
5
6
7
8
9
let obj1 = { a: [1, "2"], b: 2 };
let obj2 = { b: 2, a: [1, "2"] };

let arr1 = [1, 2, { a: 1, b: 2 }, 9];
let arr2 = [1, 2, { b: 2, a: 1 }, 9];

console.log(equal(obj1, obj2)); //返回true
console.log(equal(arr1, arr2)); //返回true
console.log(equal(obj1, arr1)); //返回false

_补充:数组 [1, 2] 和 [2, 1] 是不等的_。

解决思路

比较数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let arr1 = [1, 2, 5, 7, 9];
let arr2 = [1, 2, 5, 7, 9];
function equalArray(arr1, arr2, cb) {
if (arr1.length != arr2.length) {
return false;
}

return arr1.every(function (el, i) {
if (cb) {
cb(i);
}
return el === arr2[i];
});
}

console.log(equalArray(arr1, arr2));

比较对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj1 = { a: 1, b: 2 };
let obj2 = { b: 2, a: 1 };
function equalObject(obj1, obj2, cb) {
var aProps = Object.getOwnPropertyNames(obj1);
var bProps = Object.getOwnPropertyNames(obj2);
if (aProps.length != bProps.length) {
return false;
}
return aProps.every(function (props) {
if (cb) {
return cb(props);
}
return obj1[props] === obj2[props];
});
}
console.log(equalObject(obj1, obj2));

任意类型比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getType(obj){
return Object.prototype.toString.call(obj).replace(/\[object (\w+)\]/,"$1");
}

function equal(a,b){
var typeA = getType(a);
var typeB = getType(b);
if(typeA === 'Array'){
return equalArray(a,b,function(index){
return equal(a[index],b[index]);
})
} eles if(typeA === 'Object'){
return equalObject(a,b,function(props){
return equal(a[props],b[props])
})
} else {
return a === b;
}
}