ホームページ > 記事 > ウェブフロントエンド > imoc の「JavaScript in a Simple Language」の arraySimilar 関数
タスク 受信した 2 つの配列が類似しているかどうかを判断するには、index.html ファイルに arraysSimilar 関数を記述してください。特定の要件: 配列内のメンバーは同じ型ですが、順序は異なる場合があります。たとえば、[1, true] は [false, 2] と似ています。 配列の長さは一貫しています。 型判定範囲は、String、Boolean、Number、unknown、null、function、date、window を区別する必要があります。 上記をすべて満たす場合は「判定結果:合格」を返し、それ以外の場合は「判定結果:不合格」を返します。
これは主に「同様の」判断を求める奇妙なリクエストです。
最初の直感は、配列を直接ソートしてから型を比較することです。しかし、JS のサイズ比較の特性により、これは誤りです。
次に、それを変更する必要があります。ここでは、(O(NlogN))を近似して辞書順に並べて、それをタイプミスとして使用できるように、各要素の型名の省略形を取得します。配列全体を近似することができます (O(N )) 配列の類似性を比較します。
2つ目の注意点は、無効なパラメータの判定ですが、最初はnull
とunknown
を判定するために==null
を使用していました。の場合、パラメータの型が配列である必要があるため、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); }
この記事は、クリエイティブ コモンズ ライセンス クリエイティブ コモンズ 表示 - 非営利 - 継承 4.0 国際ライセンスに基づいて公開されています。引用、転載、または派生することは自由ですが、BlackStorm への帰属とこの記事へのリンクは保持する必要があります。許可なく商業目的で使用することはできません。ご質問や認可交渉などございましたら、私までご連絡ください。
以上がimoc の「JavaScript in a Simple Language」の arraySimilar 関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。