작업 index.html 파일에 arraysSimilar 함수를 작성하여 들어오는 두 배열이 유사한지 확인하세요. 특정 요구사항: 배열의 멤버는 동일한 유형이지만 순서는 다를 수 있습니다. 예를 들어, [1, true]는 [false, 2]와 유사합니다. 배열 길이는 일관됩니다. 유형 판단 범위는 문자열, 불리언, 숫자, 정의되지 않음, 널, 함수, 날짜, 창 등으로 구분되어야 합니다. 위의 사항이 모두 만족되면 "판정 결과: 합격"이 반환되고, 그렇지 않으면 "판정 결과: 실패"가 반환됩니다.
이것은 주로 "유사"판단을 요구하는 이상한 요청입니다.
첫 번째 본능은 배열을 직접 정렬한 다음 유형을 비교하는 것입니다. 하지만 JS의 크기 비교 특성상 이는 잘못된 것입니다.
그럼 여기서는 각 요소의 타입 이름의 약어를 취하여 (O(NlogN))을 근사화하고 사전순으로 정리한 뒤 오타로 사용하겠습니다. 전체 배열에 대해 대략 (O(N ))배열의 유사성을 비교할 수 있습니다.
두 번째로 주의할 점은 잘못된 매개변수에 대한 판단입니다. 처음에는 null
과 undefine
을 판단하는 데 사용했습니다. , 매개변수 유형은 배열이어야 하므로 instanceof
를 사용하여 판단하세요. == null
来判断null
和undefined
的,但是要求参数类型为数组,所以用instanceof
判断。
获取类型的替代方案是用Object.prototype.toString()
유형을 가져오는 대신 Object.prototype.toString()
을 사용하는 방법도 있습니다. 이 방법은 프로토타입 체인에 있는 객체의 클래스 이름을 정확하게 가져올 수 있지만 함수가 재정의될 수 있으므로 바람직하지 않습니다.
/* * param1 Array * param2 Array * return true or false */function arraysSimilar(arr1, arr2) { // 获取单个元素的类型名简写,已经满足需求 // 替代方案:考虑用Object.prototype.toString,但会被hack function getTypeNameS(item) { if (item === null)return 'nl'; else if (item instanceof Date) return 'd'; else if (item instanceof Window) return 'w'; elsereturn (typeof item)[0]; } // 获取整个数组排序后的typo function getArrayTypo(arr) { return arr.map(function (item) { return getTypeNameS(item); }).sort().join(''); } // 可以判断==null,但由于要求类型为数组,那就用instanceof if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) return false; // 长度不等的情况,可以合并到typo比较中 if (arr1.length != arr2.length)return false; // 对于typo使用内置的字符串比较 return getArrayTypo(arr1) == getArrayTypo(arr2); }
이 기사는 Creative Commons License Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License에 따라 배포됩니다. 인용, 재인쇄 또는 파생할 수 있지만 BlackStorm에 대한 귀속 및 이 기사에 대한 링크는 유지되어야 합니다. 허가 없이 상업적인 목적으로 사용할 수 없습니다. 질문이나 승인 협상이 있는 경우 저에게 연락해 주세요.
위 내용은 imooc의 'JavaScript in a Simple Language'의 arraySimilar 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!