{"id":1374,"date":"2024-06-02T22:28:33","date_gmt":"2024-06-02T22:28:33","guid":{"rendered":""},"modified":"2024-06-05T03:09:46","modified_gmt":"2024-06-04T19:09:46","slug":"javascript%e4%b8%93%e9%a2%98%e4%b9%8b%e5%ad%a6underscore%e5%9c%a8%e6%95%b0%e7%bb%84%e4%b8%ad%e6%9f%a5%e6%89%be%e6%8c%87%e5%ae%9a%e5%85%83%e7%b4%a0","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1374","title":{"rendered":"JavaScript\u4e13\u9898\u4e4b\u5b66underscore\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">\u524d\u8a00<\/h2>\n<p dir=\"auto\">\u5728\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u9047\u5230\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u7684\u9700\u6c42\uff0c\u53ef\u80fd\u5927\u5bb6\u89c9\u5f97\u8fd9\u4e2a\u9700\u6c42\u8fc7\u4e8e\u7b80\u5355\uff0c\u7136\u800c\u5982\u4f55\u4f18\u96c5\u7684\u53bb\u5b9e\u73b0\u4e00\u4e2a findIndex \u548c findLastIndex\u3001indexOf \u548c lastIndexOf \u65b9\u6cd5\u5374\u662f\u5f88\u5c11\u4eba\u53bb\u601d\u8003\u7684\u3002\u672c\u6587\u5c31\u5e26\u7740\u5927\u5bb6\u4e00\u8d77\u53c2\u8003\u7740 underscore \u53bb\u5b9e\u73b0\u8fd9\u4e9b\u65b9\u6cd5\u3002<\/p>\n<p dir=\"auto\">\u5728\u5b9e\u73b0\u524d\uff0c\u5148\u770b\u770b ES6 \u7684 findIndex \u65b9\u6cd5\uff0c\u8ba9\u5927\u5bb6\u4e86\u89e3 findIndex \u7684\u4f7f\u7528\u65b9\u6cd5\u3002<\/p>\n<h2 dir=\"auto\">findIndex<\/h2>\n<p dir=\"auto\">ES6 \u5bf9\u6570\u7ec4\u65b0\u589e\u4e86 findIndex \u65b9\u6cd5\uff0c\u5b83\u4f1a\u8fd4\u56de\u6570\u7ec4\u4e2d\u6ee1\u8db3\u63d0\u4f9b\u7684\u51fd\u6570\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u5426\u5219\u8fd4\u56de -1\u3002<\/p>\n<p dir=\"auto\">\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function isBigEnough(element) {\n  return element &gt;= 15;\n}\n\n[12, 5, 8, 130, 44].findIndex(isBigEnough);  \/\/ 3\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">isBigEnough<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">element<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">element<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">15<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">12<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">8<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">130<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">44<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">findIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">isBigEnough<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>  <span class=\"pl-c\">\/\/ 3<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">findIndex \u4f1a\u627e\u51fa\u7b2c\u4e00\u4e2a\u5927\u4e8e 15 \u7684\u5143\u7d20\u7684\u4e0b\u6807\uff0c\u6240\u4ee5\u6700\u540e\u8fd4\u56de 3\u3002<\/p>\n<p dir=\"auto\">\u662f\u4e0d\u662f\u5f88\u7b80\u5355\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u81ea\u5df1\u53bb\u5b9e\u73b0\u4e00\u4e2a findIndex \u4e5f\u5f88\u7b80\u5355\u3002<\/p>\n<h2 dir=\"auto\">\u5b9e\u73b0findIndex<\/h2>\n<p dir=\"auto\">\u601d\u8def\u81ea\u7136\u5f88\u660e\u4e86\uff0c\u904d\u5386\u4e00\u904d\uff0c\u8fd4\u56de\u7b26\u5408\u8981\u6c42\u7684\u503c\u7684\u4e0b\u6807\u5373\u53ef\u3002<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function findIndex(array, predicate, context) {\n    for (var i = 0; i &lt; array.length; i++) {\n        if (predicate.call(context, array[i], i, array)) return i;\n    }\n    return -1;\n}\n\nconsole.log(findIndex([1, 2, 3, 4], function(item, i, array){\n    if (item == 3) return true;\n})) \/\/ 2\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">findIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-c1\">++<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-en\">findIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 2<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">findLastIndex<\/h2>\n<p dir=\"auto\">findIndex \u662f\u6b63\u5e8f\u67e5\u627e\uff0c\u4f46\u6b63\u5982 indexOf \u8fd8\u6709\u4e00\u4e2a\u5bf9\u5e94\u7684 lastIndexOf \u65b9\u6cd5\uff0c\u6211\u4eec\u4e5f\u60f3\u5199\u4e00\u4e2a\u5012\u5e8f\u67e5\u627e\u7684 findLastIndex \u51fd\u6570\u3002\u5b9e\u73b0\u81ea\u7136\u4e5f\u5f88\u7b80\u5355\uff0c\u53ea\u8981\u4fee\u6539\u4e0b\u5faa\u73af\u5373\u53ef\u3002<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function findLastIndex(array, predicate, context) {\n    var length = array.length;\n    for (var i = length - 1; i &gt;= 0; i--) {\n        if (predicate.call(context, array[i], i, array)) return i;\n    }\n    return -1;\n}\n\nconsole.log(findLastIndex([1, 2, 3, 4], function(item, index, array){\n    if (item == 1) return true;\n})) \/\/ 0\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">findLastIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">-<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-c1\">--<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-en\">findLastIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 0<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">createIndexFinder<\/h2>\n<p dir=\"auto\">\u7136\u800c\u95ee\u9898\u5728\u4e8e\uff0cfindIndex \u548c findLastIndex \u5176\u5b9e\u6709\u5f88\u591a\u91cd\u590d\u7684\u90e8\u5206\uff0c\u5982\u4f55\u7cbe\u7b80\u5197\u4f59\u7684\u5185\u5bb9\u5462\uff1f\u8fd9\u4fbf\u662f\u6211\u4eec\u8981\u5b66\u4e60\u7684\u5730\u65b9\uff0c\u65e5\u540e\u9762\u8bd5\u95ee\u5230\u6b64\u7c7b\u95ee\u9898\uff0c\u4e5f\u662f\u52a0\u5206\u7684\u9009\u9879\u3002<\/p>\n<p dir=\"auto\">underscore \u7684\u601d\u8def\u5c31\u662f\u5229\u7528\u4f20\u53c2\u7684\u4e0d\u540c\uff0c\u8fd4\u56de\u4e0d\u540c\u7684\u51fd\u6570\u3002\u8fd9\u4e2a\u81ea\u7136\u662f\u7b80\u5355\uff0c\u4f46\u662f\u5982\u4f55\u6839\u636e\u53c2\u6570\u7684\u4e0d\u540c\uff0c\u5728\u540c\u4e00\u4e2a\u5faa\u73af\u4e2d\uff0c\u5b9e\u73b0\u6b63\u5e8f\u548c\u5012\u5e8f\u904d\u5386\u5462\uff1f<\/p>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u76f4\u63a5\u6a21\u4eff underscore \u7684\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function createIndexFinder(dir) {\n    return function(array, predicate, context) {\n\n        var length = array.length;\n        var index = dir &gt; 0 ? 0 : length - 1;\n\n        for (; index &gt;= 0 &amp;&amp; index &lt; length; index += dir) {\n            if (predicate.call(context, array[index], index, array)) return index;\n        }\n\n        return -1;\n    }\n}\n\nvar findIndex = createIndexFinder(1);\nvar findLastIndex = createIndexFinder(-1);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createIndexFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-c1\">0<\/span> : <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">-<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">+=<\/span> <span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">findIndex<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">findLastIndex<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">sortedIndex<\/h2>\n<p dir=\"auto\">findIndex \u548c findLastIndex \u7684\u9700\u6c42\u7b97\u662f\u7ed3\u675f\u4e86\uff0c\u4f46\u662f\u53c8\u6765\u4e86\u4e00\u4e2a\u65b0\u9700\u6c42\uff1a\u5728\u4e00\u4e2a\u6392\u597d\u5e8f\u7684\u6570\u7ec4\u4e2d\u627e\u5230 value \u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u4fdd\u8bc1\u63d2\u5165\u6570\u7ec4\u540e\uff0c\u4f9d\u7136\u4fdd\u6301\u6709\u5e8f\u7684\u72b6\u6001\u3002<\/p>\n<p dir=\"auto\">\u5047\u8bbe\u8be5\u51fd\u6570\u547d\u540d\u4e3a sortedIndex\uff0c\u6548\u679c\u4e3a\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sortedIndex([10, 20, 30], 25); \/\/ 2\">\n<pre class=\"notranslate\"><span class=\"pl-en\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">20<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">30<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">25<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 2<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e5f\u5c31\u662f\u8bf4\u5982\u679c\uff0c\u6ce8\u610f\u662f\u5982\u679c\uff0c25 \u6309\u7167\u6b64\u4e0b\u6807\u63d2\u5165\u6570\u7ec4\u540e\uff0c\u6570\u7ec4\u53d8\u6210 [10, 20, 25, 30]\uff0c\u6570\u7ec4\u4f9d\u7136\u662f\u6709\u5e8f\u7684\u72b6\u6001\u3002<\/p>\n<p dir=\"auto\">\u90a3\u4e48\u8fd9\u4e2a\u53c8\u8be5\u5982\u4f55\u5b9e\u73b0\u5462\uff1f<\/p>\n<p dir=\"auto\">\u65e2\u7136\u662f\u6709\u5e8f\u7684\u6570\u7ec4\uff0c\u90a3\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u904d\u5386\uff0c\u5927\u53ef\u4ee5\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u6cd5\uff0c\u786e\u5b9a\u503c\u7684\u4f4d\u7f6e\u3002\u8ba9\u6211\u4eec\u5c1d\u8bd5\u7740\u53bb\u5199\u4e00\u7248\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b2c\u4e00\u7248\nfunction sortedIndex(array, obj) {\n\n    var low = 0, high = array.length;\n\n    while (low &lt; high) {\n        var mid = Math.floor((low + high) \/ 2);\n        if (array[mid] &lt; obj) low = mid + 1;\n        else high = mid;\n    }\n\n    return high;\n};\n\nconsole.log(sortedIndex([10, 20, 30, 40, 50], 35)) \/\/ 3\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u4e00\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">high<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">mid<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">floor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">\/<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">mid<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">mid<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">else<\/span> <span class=\"pl-s1\">high<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">mid<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-en\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">20<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">30<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">40<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">50<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">35<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 3<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u73b0\u5728\u7684\u65b9\u6cd5\u867d\u7136\u80fd\u7528\uff0c\u4f46\u901a\u7528\u6027\u4e0d\u591f\uff0c\u6bd4\u5982\u6211\u4eec\u5e0c\u671b\u80fd\u5904\u7406\u8fd9\u6837\u7684\u60c5\u51b5\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ stooges \u914d\u89d2 \u6bd4\u5982 \u4e09\u4e2a\u81ed\u76ae\u5320 The Three Stooges\nvar stooges = [{name: 'stooge1', age: 10}, {name: 'stooge2', age: 30}];\n\nvar result = sortedIndex(stooges, {name: 'stooge3', age: 20}, function(stooge){\n    return stooge.age\n});\n\nconsole.log(result) \/\/ 1\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ stooges \u914d\u89d2 \u6bd4\u5982 \u4e09\u4e2a\u81ed\u76ae\u5320 The Three Stooges<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">stooges<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'stooge1'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">age<\/span>: <span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'stooge2'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">age<\/span>: <span class=\"pl-c1\">30<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">result<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">stooges<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'stooge3'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">age<\/span>: <span class=\"pl-c1\">20<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">stooge<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">stooge<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">age<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">result<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 1<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6240\u4ee5\u6211\u4eec\u8fd8\u9700\u8981\u518d\u52a0\u4e0a\u4e00\u4e2a\u53c2\u6570 iteratee \u51fd\u6570\u5bf9\u6570\u7ec4\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u8fdb\u884c\u5904\u7406\uff0c\u4e00\u822c\u8fd9\u4e2a\u65f6\u5019\uff0c\u8fd8\u4f1a\u6d89\u53ca\u5230 this \u6307\u5411\u7684\u95ee\u9898\uff0c\u6240\u4ee5\u6211\u4eec\u518d\u4f20\u4e00\u4e2a context \u6765\u8ba9\u6211\u4eec\u53ef\u4ee5\u6307\u5b9a this\uff0c\u90a3\u4e48\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u53c8\u8be5\u5982\u4f55\u5199\u5462\uff1f<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b2c\u4e8c\u7248\nfunction cb(func, context) {\n       if (context === void 0) return func;\n       return function() {\n           return func.apply(context, arguments);\n      };\n}\n\nfunction sortedIndex(array, obj, iteratee, context) {\n\n    iteratee = cb(iteratee, context)\n\n    var low = 0, high = array.length;\n    while (low &lt; high) {\n        var mid = Math.floor((low + high) \/ 2);\n        if (iteratee(array[mid]) &lt; iteratee(obj)) low = mid + 1;\n        else high = mid;\n    }\n    return high;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u4e8c\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">cb<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n       <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">context<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-k\">void<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">;<\/span>\n       <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n           <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">apply<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">arguments<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">iteratee<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-s1\">iteratee<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">cb<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">iteratee<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span>\n\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">high<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">mid<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">floor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">\/<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">iteratee<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">mid<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">iteratee<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-s1\">low<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">mid<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">else<\/span> <span class=\"pl-s1\">high<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">mid<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">high<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">indexOf<\/h2>\n<p dir=\"auto\">sortedIndex \u4e5f\u5b8c\u6210\u4e86\uff0c\u73b0\u5728\u6211\u4eec\u5c1d\u8bd5\u7740\u53bb\u5199\u4e00\u4e2a indexOf \u548c lastIndexOf \u51fd\u6570\uff0c\u5b66\u4e60 findIndex \u548c FindLastIndex \u7684\u65b9\u5f0f\uff0c\u6211\u4eec\u5199\u4e00\u7248\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b2c\u4e00\u7248\nfunction createIndexOfFinder(dir) {\n    return function(array, item){\n        var length = array.length;\n        var index = dir &gt; 0 ? 0 : length - 1;\n        for (; index &gt;= 0 &amp;&amp; index &lt; length; index += dir) {\n            if (array[index] === item) return index;\n        }\n        return -1;\n    }\n}\n\nvar indexOf = createIndexOfFinder(1);\nvar lastIndexOf = createIndexOfFinder(-1);\n\nvar result = indexOf([1, 2, 3, 4, 5], 2);\n\nconsole.log(result) \/\/ 1\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u4e00\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-c1\">0<\/span> : <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">-<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">index<\/span> <span class=\"pl-c1\">+=<\/span> <span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">index<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">indexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">lastIndexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">result<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">indexOf<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">result<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 1<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">fromIndex<\/h2>\n<p dir=\"auto\">\u4f46\u662f\u5373\u4f7f\u662f\u6570\u7ec4\u7684 indexOf \u65b9\u6cd5\u4e5f\u53ef\u4ee5\u591a\u4f20\u9012\u4e00\u4e2a\u53c2\u6570 fromIndex\uff0c\u4ece MDN \u4e2d\u770b\u5230 fromIndex \u7684\u8bb2\u7a76\u53ef\u6709\u70b9\u591a\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">\u8bbe\u5b9a\u5f00\u59cb\u67e5\u627e\u7684\u4f4d\u7f6e\u3002\u5982\u679c\u8be5\u7d22\u5f15\u503c\u5927\u4e8e\u6216\u7b49\u4e8e\u6570\u7ec4\u957f\u5ea6\uff0c\u610f\u5473\u7740\u4e0d\u4f1a\u5728\u6570\u7ec4\u91cc\u67e5\u627e\uff0c\u8fd4\u56de -1\u3002\u5982\u679c\u53c2\u6570\u4e2d\u63d0\u4f9b\u7684\u7d22\u5f15\u503c\u662f\u4e00\u4e2a\u8d1f\u503c\uff0c\u5219\u5c06\u5176\u4f5c\u4e3a\u6570\u7ec4\u672b\u5c3e\u7684\u4e00\u4e2a\u62b5\u6d88\uff0c\u5373 -1 \u8868\u793a\u4ece\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u5f00\u59cb\u67e5\u627e\uff0c-2 \u8868\u793a\u4ece\u5012\u6570\u7b2c\u4e8c\u4e2a\u5143\u7d20\u5f00\u59cb\u67e5\u627e \uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002 \u6ce8\u610f\uff1a\u5982\u679c\u53c2\u6570\u4e2d\u63d0\u4f9b\u7684\u7d22\u5f15\u503c\u662f\u4e00\u4e2a\u8d1f\u503c\uff0c\u4ecd\u7136\u4ece\u524d\u5411\u540e\u67e5\u8be2\u6570\u7ec4\u3002\u5982\u679c\u62b5\u6d88\u540e\u7684\u7d22\u5f15\u503c\u4ecd\u5c0f\u4e8e 0\uff0c\u5219\u6574\u4e2a\u6570\u7ec4\u90fd\u5c06\u4f1a\u88ab\u67e5\u8be2\u3002\u5176\u9ed8\u8ba4\u503c\u4e3a 0\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u518d\u770b\u770b lastIndexOf \u7684 fromIndex\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u9006\u5411\u67e5\u627e\u3002\u9ed8\u8ba4\u4e3a\u6570\u7ec4\u7684\u957f\u5ea6\u51cf 1\uff0c\u5373\u6574\u4e2a\u6570\u7ec4\u90fd\u88ab\u67e5\u627e\u3002\u5982\u679c\u8be5\u503c\u5927\u4e8e\u6216\u7b49\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u5219\u6574\u4e2a\u6570\u7ec4\u4f1a\u88ab\u67e5\u627e\u3002\u5982\u679c\u4e3a\u8d1f\u503c\uff0c\u5c06\u5176\u89c6\u4e3a\u4ece\u6570\u7ec4\u672b\u5c3e\u5411\u524d\u7684\u504f\u79fb\u3002\u5373\u4f7f\u8be5\u503c\u4e3a\u8d1f\uff0c\u6570\u7ec4\u4ecd\u7136\u4f1a\u88ab\u4ece\u540e\u5411\u524d\u67e5\u627e\u3002\u5982\u679c\u8be5\u503c\u4e3a\u8d1f\u65f6\uff0c\u5176\u7edd\u5bf9\u503c\u5927\u4e8e\u6570\u7ec4\u957f\u5ea6\uff0c\u5219\u65b9\u6cd5\u8fd4\u56de -1\uff0c\u5373\u6570\u7ec4\u4e0d\u4f1a\u88ab\u67e5\u627e\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u6309\u7167\u8fd9\u4e48\u591a\u7684\u89c4\u5219\uff0c\u6211\u4eec\u5c1d\u8bd5\u7740\u53bb\u5199\u7b2c\u4e8c\u7248\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/\/ \u7b2c\u4e8c\u7248\nfunction createIndexOfFinder(dir) {\n\n    return function(array, item, idx){\n        var length = array.length;\n        var i = 0;\n\n        if (typeof idx == \"number\") {\n            if (dir &gt; 0) {\n                i = idx &gt;= 0 ? idx : Math.max(length + idx, 0);\n            }\n            else {\n                length = idx &gt;= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n            }\n        }\n\n        for (idx = dir &gt; 0 ? i : length - 1; idx &gt;= 0 &amp;&amp; idx &lt; length; idx += dir) {\n            if (array[idx] === item) return idx;\n        }\n        return -1;\n    }\n}\n\nvar indexOf = createIndexOfFinder(1);\nvar lastIndexOf = createIndexOfFinder(-1);'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u4e8c\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">typeof<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-s\">\"number\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">idx<\/span> : <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">max<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n            <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">min<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">)<\/span> : <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">i<\/span> : <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">-<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+=<\/span> <span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">indexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">lastIndexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u4f18\u5316<\/h2>\n<p dir=\"auto\">\u5230\u6b64\u4e3a\u6b62\uff0c\u5df2\u7ecf\u5f88\u63a5\u8fd1\u539f\u751f\u7684 indexOf \u51fd\u6570\u4e86\uff0c\u4f46\u662f underscore \u5728\u6b64\u57fa\u7840\u4e0a\u8fd8\u505a\u4e86\u4e24\u70b9\u4f18\u5316\u3002<\/p>\n<p dir=\"auto\">\u7b2c\u4e00\u4e2a\u4f18\u5316\u662f\u652f\u6301\u67e5\u627e NaN\u3002<\/p>\n<p dir=\"auto\">\u56e0\u4e3a NaN \u4e0d\u5168\u7b49\u4e8e NaN\uff0c\u6240\u4ee5\u539f\u751f\u7684 indexOf \u5e76\u4e0d\u80fd\u627e\u51fa NaN \u7684\u4e0b\u6807\u3002<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[1, NaN].indexOf(NaN) \/\/ -1\">\n<pre class=\"notranslate\"><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-v\">NaN<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">indexOf<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">NaN<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ -1<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u90a3\u4e48\u6211\u4eec\u8be5\u5982\u4f55\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\u5462\uff1f<\/p>\n<p dir=\"auto\">\u5c31\u662f\u4ece\u6570\u7ec4\u4e2d\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u503c\u7684\u4e0b\u6807\u561b\uff0c\u4e0d\u5c31\u662f\u6211\u4eec\u6700\u4e00\u5f00\u59cb\u5199\u7684 findIndex \u5417\uff1f<\/p>\n<p dir=\"auto\">\u6211\u4eec\u6765\u5199\u4e00\u4e0b\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b2c\u4e09\u7248\nfunction createIndexOfFinder(dir, predicate) {\n\n    return function(array, item, idx){\n\n        if () { ... }\n\n        \/\/ \u5224\u65ad\u5143\u7d20\u662f\u5426\u662f NaN\n        if (item !== item) {\n            \/\/ \u5728\u622a\u53d6\u597d\u7684\u6570\u7ec4\u4e2d\u67e5\u627e\u7b2c\u4e00\u4e2a\u6ee1\u8db3isNaN\u51fd\u6570\u7684\u5143\u7d20\u7684\u4e0b\u6807\n            idx = predicate(array.slice(i, length), isNaN)\n            return idx &gt;= 0 ? idx + i: -1;\n        }\n\n        for () { ... }\n    }\n}\n\nvar indexOf = createIndexOfFinder(1, findIndex);\nvar lastIndexOf = createIndexOfFinder(-1, findLastIndex);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u4e09\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span> ... <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-c\">\/\/ \u5224\u65ad\u5143\u7d20\u662f\u5426\u662f NaN<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span> <span class=\"pl-c1\">!==<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c\">\/\/ \u5728\u622a\u53d6\u597d\u7684\u6570\u7ec4\u4e2d\u67e5\u627e\u7b2c\u4e00\u4e2a\u6ee1\u8db3isNaN\u51fd\u6570\u7684\u5143\u7d20\u7684\u4e0b\u6807<\/span>\n            <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">slice<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">isNaN<\/span><span class=\"pl-kos\">)<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">i<\/span>: <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span> ... <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">indexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">findIndex<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">var<\/span> <span class=\"pl-s1\">lastIndexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">findLastIndex<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7b2c\u4e8c\u4e2a\u4f18\u5316\u662f\u652f\u6301\u5bf9\u6709\u5e8f\u7684\u6570\u7ec4\u8fdb\u884c\u66f4\u5feb\u7684\u4e8c\u5206\u67e5\u627e\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c indexOf \u7b2c\u4e09\u4e2a\u53c2\u6570\u4e0d\u4f20\u5f00\u59cb\u641c\u7d22\u7684\u4e0b\u6807\u503c\uff0c\u800c\u662f\u4e00\u4e2a\u5e03\u5c14\u503c true\uff0c\u5c31\u8ba4\u4e3a\u6570\u7ec4\u662f\u4e00\u4e2a\u6392\u597d\u5e8f\u7684\u6570\u7ec4\uff0c\u8fd9\u65f6\u5019\uff0c\u5c31\u4f1a\u91c7\u7528\u66f4\u5feb\u7684\u4e8c\u5206\u6cd5\u8fdb\u884c\u67e5\u627e\uff0c\u8fd9\u4e2a\u65f6\u5019\uff0c\u53ef\u4ee5\u5229\u7528\u6211\u4eec\u5199\u7684 sortedIndex \u51fd\u6570\u3002<\/p>\n<p dir=\"auto\">\u5728\u8fd9\u91cc\u76f4\u63a5\u7ed9\u6700\u7ec8\u7684\u6e90\u7801\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/\/ \u7b2c\u56db\u7248\nfunction createIndexOfFinder(dir, predicate, sortedIndex) {\n\n    return function(array, item, idx){\n        var length = array.length;\n        var i = 0;\n\n        if (typeof idx == \"number\") {\n            if (dir &gt; 0) {\n                i = idx &gt;= 0 ? idx : Math.max(length + idx, 0);\n            }\n            else {\n                length = idx &gt;= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n            }\n        }\n        else if (sortedIndex &amp;&amp; idx &amp;&amp; length) {\n            idx = sortedIndex(array, item);\n            \/\/ \u5982\u679c\u8be5\u63d2\u5165\u7684\u4f4d\u7f6e\u7684\u503c\u6b63\u597d\u7b49\u4e8e\u5143\u7d20\u7684\u503c\uff0c\u8bf4\u660e\u662f\u7b2c\u4e00\u4e2a\u7b26\u5408\u8981\u6c42\u7684\u503c\n            return array[idx] === item ? idx : -1;\n        }\n\n        \/\/ \u5224\u65ad\u662f\u5426\u662f NaN\n        if (item !== item) {\n            idx = predicate(array.slice(i, length), isNaN)\n            return idx &gt;= 0 ? idx + i: -1;\n        }\n\n        for (idx = dir &gt; 0 ? i : length - 1; idx &gt;= 0 &amp;&amp; idx &lt; length; idx += dir) {\n            if (array[idx] === item) return idx;\n        }\n        return -1;\n    }\n}\n\nvar indexOf = createIndexOfFinder(1, findIndex, sortedIndex);\nvar lastIndexOf = createIndexOfFinder(-1, findLastIndex);'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b2c\u56db\u7248<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">sortedIndex<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">typeof<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">==<\/span> <span class=\"pl-s\">\"number\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">idx<\/span> : <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">max<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n            <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-v\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">min<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">)<\/span> : <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-k\">else<\/span> <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">sortedIndex<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">sortedIndex<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-c\">\/\/ \u5982\u679c\u8be5\u63d2\u5165\u7684\u4f4d\u7f6e\u7684\u503c\u6b63\u597d\u7b49\u4e8e\u5143\u7d20\u7684\u503c\uff0c\u8bf4\u660e\u662f\u7b2c\u4e00\u4e2a\u7b26\u5408\u8981\u6c42\u7684\u503c<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">item<\/span> ? <span class=\"pl-s1\">idx<\/span> : <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-c\">\/\/ \u5224\u65ad\u662f\u5426\u662f NaN<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">item<\/span> <span class=\"pl-c1\">!==<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">predicate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">slice<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">isNaN<\/span><span class=\"pl-kos\">)<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">i<\/span>: <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">dir<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0<\/span> ? <span class=\"pl-s1\">i<\/span> : <span class=\"pl-s1\">length<\/span> <span class=\"pl-c1\">-<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-c1\">0<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">idx<\/span> <span class=\"pl-c1\">+=<\/span> <span class=\"pl-s1\">dir<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">array<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">item<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">idx<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">indexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">findIndex<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">sortedIndex<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">lastIndexOf<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">createIndexOfFinder<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">findLastIndex<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff1a\u5728 underscore \u7684\u5b9e\u73b0\u4e2d\uff0c\u53ea\u6709 indexOf \u662f\u652f\u6301\u6709\u5e8f\u6570\u7ec4\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\uff0clastIndexOf \u5e76\u4e0d\u652f\u6301\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/37'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/37<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u5728\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u9047\u5230\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u7684\u9700\u6c42\uff0c\u53ef\u80fd\u5927\u5bb6\u89c9\u5f97\u8fd9\u4e2a\u9700\u6c42\u8fc7\u4e8e\u7b80\u5355\uff0c\u7136\u800c\u5982\u4f55\u4f18\u96c5\u7684\u53bb\u5b9e\u73b0\u4e00\u4e2a findIndex \u548c findLastInd&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1374\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1374","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1374"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1374"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1374\/revisions"}],"predecessor-version":[{"id":1467,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1374\/revisions\/1467"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}