Aufgabe Bitte schreiben Sie die Funktion arraysSimilar in die Datei index.html, um festzustellen, ob die beiden eingehenden Arrays ähnlich sind. Spezifische Bedürfnisse: Die Mitglieder im Array sind vom gleichen Typ, die Reihenfolge kann jedoch unterschiedlich sein. Beispielsweise ähnelt [1, wahr] [falsch, 2]. Die Länge der Arrays ist konsistent. Der Typbeurteilungsbereich muss unterschieden werden: String, Boolean, Number, undefiniert, null, Funktion, Datum, Fenster. Wenn alle oben genannten Punkte erfüllt sind, wird „Beurteilungsergebnis: Bestanden“ zurückgegeben, andernfalls wird „Beurteilungsergebnis: Nicht bestanden“ zurückgegeben.
Dies ist eine seltsame Anforderung, die hauptsächlich nach einem „ähnlichen“ Urteil verlangt.
Der erste Instinkt besteht darin, das Array direkt zu sortieren und dann die Typen zu vergleichen. Aufgrund der Größenvergleichsfunktion von JS ist dies jedoch falsch.
Dann müssen Sie es ändern. Hier nehme ich die Abkürzung des Typnamens jedes Elements. Dies kann (O(NlogN)) in Wörterbuchreihenfolge sein und es dann als Tippfehler verwenden Ungefähr das gesamte Array. (O(N)) vergleicht Arrays, um festzustellen, ob sie ähnlich sind.
Der zweite zu beachtende Punkt ist die Beurteilung ungültiger Parameter. Ursprünglich wurde == null
zur Beurteilung von null
und undefined
verwendet, aber der Parametertyp muss ein Array sein, daher wurde instanceof
verwendet Richter.
Eine Alternative zum Abrufen des Typs ist die Verwendung von Object.prototype.toString()
, mit dem der Klassenname des Objekts in der Prototypenkette genau ermittelt werden kann. Die Funktion kann jedoch überschrieben werden und wird daher nicht bevorzugt.
/* * 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); }
Dieser Artikel wird unter der Creative Commons-Lizenzvereinbarung Creative Commons Attribution-Noncommercial-ShareAlike 4.0 International License veröffentlicht. Sie können ihn gerne zitieren, nachdrucken oder ableiten, aber Sie müssen die Namensnennung BlackStorm und das beibehalten Link zu diesem Artikel und darf ohne Genehmigung nicht für kommerzielle Zwecke verwendet werden. Bei Fragen oder Genehmigungsverhandlungen kontaktieren Sie mich bitte.
Das obige ist der detaillierte Inhalt vonEine arraySimilar-Funktion in imoocs „JavaScript in a Simple Language'. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!