1. JS 객체에서 Key의 비 반복 된 키의 원리에 따르면, 배열을 기억하는 방법은 가장 일반적인 사고에 따라 다음과 같습니다.
다음과 같이 코드 코드를 복사하십시오.
함수 별도 (ARR) {
var obj = {}, temp = [];
for (var i = 0; i <arr.length; i ++) {
if (! obj [arr [i]]) {{
temp.push (arr [i]);
obj [arr [i]] = true;
}
}
반환 온도;
}
var testarr = [1,2,3,2];
Console.log (Constrarray (testarr)); // [1,2,3]
꽤 좋아 보이지만 상황으로 바뀌면 :
var testarr1 = [1,2,3, "2"];
Console.log (Constrarray (testarr)); // [1,2,3]
그것은 우리가 원하는 결과가 아닙니다. .
위의 응답으로 위의 방법을 개선합니다.
다음과 같이 코드 코드를 복사하십시오.
함수 COREATHARRAYIMPROVE (ARR) {
var obj = {}, temp = [];
for (var i = 0; i <arr.length; i ++) {
if (! obj [typeof (arr [i])+arr [i]) {) {
temp.push (arr [i]);
obj [typeof (arr [i])+arr [i]] = true;
}
}
반환 온도;
}
위의 방법은 키가 객체에 넣을 때 Typeof의 접두사를 추가하므로 효과를 보자.
var testarr1 = [1,2,3, "2"];
Console.log (Constrarray (testarr)); // [1,2,3, "2"]
멍청이, 좋아요! 이 기능은 완전히 괜찮습니다. 다른 상황을 보자!
var testarr1 = [1,2,3, "2", {a : 1}, {b : 1}];
Console.log (Constrarray (testarr)); // [1,2,3, "2", {a : 1}]
이 결과, {b : 1}을 삭제하는 방법은 명백히 삭제하는 것이 매우 심각한 문제이므로 위의 방법은 완벽하지 않아서 내려 놓으십시오. .
2. 1에서, 우리의 주요 아이디어는 JS 객체에서 Key의 개념을 사용하여 우리의 사고를 안내하는 것이지만 결국 모든 문제에 대한 해결책이 없습니다. 우리는 원합니다
슬라이스 및 스플 라이스 방법을 사용하여 다음과 같이 배열의 무게를 달성하십시오.
다음과 같이 코드 코드를 복사하십시오.
함수 distancerray2 (arr) {{
var test = arr.slice (0);
for (var i = 0; i <temp.length; i ++) {
for (j = i+1; j <temp.length; j ++) {
if (temp [j] == temp [i]) {
temp.splice (j, 1);
j ---;
}
}
}
반환 온도;
}
시험:
var testarr1 = [1,2,3, "2"];
Console.log (Constrarray (testarr)); // [1,2,3]
var testarr2 = [1,2,2, {a : 1}, {a : 1}, {a : 1, b : 2}, function () {alert ( "b");}, function () {alert ("비");}];;
// [1,2, {a : 1}, {a : 1}, {a : 1, b : 2}, function () {alert ( "b");}, function () {alert ( "b ( "B");}]
테스트 결과는 여전히 우리의 요구를 충족시킬 수 없습니다. 우리 팀의 위의 방법을 연구 한 후, 주요 문제는 두 객체를 비교하여 비교하기 위해 두 객체를 비교하는 데있어서, 큰 객체의 내용이 이 상황을 고려할 때, 우리는, 우리, 우리, 우리, 우리, 우리는 할 수 있습니다.
다음과 같이 코드 코드를 복사하십시오.
기능 DistancerRayall (ARR) {
var isequal = function (obj1, obj2) {{
// 두 객체가 같고 동일해야합니다.
if (obj1 === obj2) {{
진실을 반환하십시오.
}
if (typeof (obj1) == typeof (obj2)) {{
if (ibj1) == "object"&& typeof (obj2) == "object") {{
var pcount = 0;
for (var p in obj1) {
pcount ++;
if (! isequal (obj1 [p], obj2 [p]) {{
거짓을 반환합니다.
}
}
for (var p in obj2) {
pcount-;
}
pcount == 0;
} else if (typeof (obj1) == "function"&& typeof (obj2) == "function") {
if (obj1.tostring () !! = obj2.tostring ()) {
거짓을 반환합니다.
}
} 또 다른 {
if (obj1! = obj2) {{
거짓을 반환합니다.
}
}
} 또 다른 {
거짓을 반환합니다.
}
진실을 반환하십시오.
}
var test = arr.slice (0);
for (var i = 0; i <temp.length; i ++) {
for (j = i+1; j <temp.length; j ++) {
ifqual (temp [j], temp [i]) {{) {{
temp.splice (j, 1);
j ---;
}
}
}
반환 온도;
}
시험:
var testarr3 = [1,2,2, {a : 1}, {a : 1}, {a : 1, b : 2}, function () {alert ( "b");}, function () {alert ("비");}];;
Console.log (ConstrayAll (TestArr3));
// 결과 [1,2, {a : 1}, {a : 1, b : 2}, function () {alert ( "b");}]
죄송합니다. 마침내 각 방법의 성능 문제에 관해서는 다음 토론을 유지합니다. 우리는 마지막 방법은 복잡한 배열에 중요 할 수있는 법을 강조하는 것임을 알 수 있지만, 해당 실행 오버 헤드도 실제 프로젝트 개발에 필요한 것이 순수한 숫자 일 수도 있습니다. 무거운 것은 필요에 따라 해당 알고리즘을 유연하게 선택해야합니다.