How to move to prev/next element of an array

<span class="kwd">var</span><span class="pln"> iterifyArr </span><span class="pun">=</span> <span class="kwd">function</span> <span class="pun">(</span><span class="pln">arr</span><span class="pun">)</span> <span class="pun">{</span>
    <span class="kwd">var</span><span class="pln"> cur </span><span class="pun">=</span> <span class="lit">0</span><span class="pun">;</span><span class="pln">
    arr</span><span class="pun">.</span><span class="kwd">next</span> <span class="pun">=</span> <span class="pun">(</span><span class="kwd">function</span> <span class="pun">()</span> <span class="pun">{</span> <span class="kwd">return</span> <span class="pun">(++</span><span class="pln">cur </span><span class="pun">>=</span> <span class="kwd">this</span><span class="pun">.</span><span class="pln">length</span><span class="pun">)</span> <span class="pun">?</span> <span class="kwd">false</span> <span class="pun">:</span> <span class="kwd">this</span><span class="pun">[</span><span class="pln">cur</span><span class="pun">];</span> <span class="pun">});</span><span class="pln">
    arr</span><span class="pun">.</span><span class="pln">prev </span><span class="pun">=</span> <span class="pun">(</span><span class="kwd">function</span> <span class="pun">()</span> <span class="pun">{</span> <span class="kwd">return</span> <span class="pun">(--</span><span class="pln">cur </span><span class="pun"><</span> <span class="lit">0</span><span class="pun">)</span> <span class="pun">?</span> <span class="kwd">false</span> <span class="pun">:</span> <span class="kwd">this</span><span class="pun">[</span><span class="pln">cur</span><span class="pun">];</span> <span class="pun">});</span>
    <span class="kwd">return</span><span class="pln"> arr</span><span class="pun">;</span>
<span class="pun">};</span>

<span class="kwd">var</span><span class="pln"> fibonacci </span><span class="pun">=</span> <span class="pun">[</span><span class="lit">1</span><span class="pun">,</span> <span class="lit">1</span><span class="pun">,</span> <span class="lit">2</span><span class="pun">,</span> <span class="lit">3</span><span class="pun">,</span> <span class="lit">5</span><span class="pun">,</span> <span class="lit">8</span><span class="pun">,</span> <span class="lit">13</span><span class="pun">];</span><span class="pln">
iterifyArr</span><span class="pun">(</span><span class="pln">fibonacci</span><span class="pun">);</span><span class="pln">

fibonacci</span><span class="pun">.</span><span class="pln">prev</span><span class="pun">();</span> <span class="com">// returns false</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 1</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 1</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 2</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 3</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 5</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 8</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="pln">prev</span><span class="pun">();</span> <span class="com">// returns 5</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 8</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns 13</span><span class="pln">
fibonacci</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">();</span> <span class="com">// returns false</span>

Javascript: Array.prototype.findIndex()

The <strong><span style="color: #333333;">findIndex()</span></strong> method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test.

 

StackOverflow

Given:

<span class="kwd">var</span><span class="pln"> peoples </span><span class="pun">=</span> <span class="pun">[</span>
  <span class="pun">{</span> <span class="str">"attr1"</span><span class="pun">:</span> <span class="str">"bob"</span><span class="pun">,</span> <span class="str">"attr2"</span><span class="pun">:</span> <span class="str">"pizza"</span> <span class="pun">},</span>
  <span class="pun">{</span> <span class="str">"attr1"</span><span class="pun">:</span> <span class="str">"john"</span><span class="pun">,</span> <span class="str">"attr2"</span><span class="pun">:</span> <span class="str">"sushi"</span> <span class="pun">},</span>
  <span class="pun">{</span> <span class="str">"attr1"</span><span class="pun">:</span> <span class="str">"larry"</span><span class="pun">,</span> <span class="str">"attr2"</span><span class="pun">:</span> <span class="str">"hummus"</span> <span class="pun">}</span>
<span class="pun">];</span>

.. There’s now a great way of doing this called findIndex which takes a function that return <span style="color: #242729;">true</span>/<span style="color: #242729;">false</span> based on whether the array element matches (as always, check for browser compatibility though).

<span class="kwd">var</span><span class="pln"> index </span><span class="pun">=</span><span class="pln"> peoples</span><span class="pun">.</span><span class="pln">findIndex</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">person</span><span class="pun">)</span> <span class="pun">{</span>
  <span class="kwd">return</span><span class="pln"> person</span><span class="pun">.</span><span class="pln">attr1 </span><span class="pun">==</span> <span class="str">"john"</span>
<span class="pun">}</span>

With ES6 syntax you get to write this:

<span class="kwd">var</span><span class="pln"> index </span><span class="pun">=</span><span class="pln"> peoples</span><span class="pun">.</span><span class="pln">findIndex</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=></span><span class="pln"> p</span><span class="pun">.</span><span class="pln">attr1 </span><span class="pun">==</span> <span class="str">"john"</span><span class="pun">)</span>

 

Javascript: Inner Functions

Inner functions

JavaScript function declarations are allowed inside other functions. We’ve seen this once before, with an earlier <span style="color: #333333;">makePerson()</span> function. An important detail of nested functions in JavaScript is that they can access variables in their parent function’s scope:

<span class="token keyword">function</span> <span class="token function">parentFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>

  <span class="token keyword">function</span> <span class="token function">nestedFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">;</span> <span class="token comment">// parentFunc can't use this</span>
    <span class="token keyword">return</span> a <span class="token operator">+</span> b<span class="token punctuation">;</span> 
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> <span class="token function">nestedFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 5</span>
<span class="token punctuation">}</span>

This provides a great deal of utility in writing more maintainable code. If a called function relies on one or two other functions that are not useful to any other part of your code, you can nest those utility functions inside it. This keeps the number of functions that are in the global scope down, which is always a good thing.

This is also a great counter to the lure of global variables. When writing complex code it is often tempting to use global variables to share values between multiple functions — which leads to code that is hard to maintain. Nested functions can share variables in their parent, so you can use that mechanism to couple functions together when it makes sense without polluting your global namespace — “local globals” if you like. This technique should be used with caution, but it’s a useful ability to have.

Javascript Custom Objects with prototype

That’s better: we are creating the method functions only once, and assigning references to them inside the constructor. Can we do any better than that? The answer is yes:

<span class="token keyword">function</span> <span class="token function">Person</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">this</span><span class="token punctuation">.</span>first <span class="token operator">=</span> first<span class="token punctuation">;</span>
  <span class="token keyword">this</span><span class="token punctuation">.</span>last <span class="token operator">=</span> last<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
Person<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">fullName</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>first <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>last<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
Person<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">fullNameReversed</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>last <span class="token operator">+</span> <span class="token string">', '</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>first<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span style="color: #333333;">Person.prototype</span> is an object shared by all instances of <span style="color: #333333;">Person</span>. It forms part of a lookup chain (that has a special name, “prototype chain”): any time you attempt to access a property of <span style="color: #333333;">Person</span> that isn’t set, JavaScript will check <span style="color: #333333;">Person.prototype</span> to see if that property exists there instead. As a result, anything assigned to <span style="color: #333333;">Person.prototype</span> becomes available to all instances of that constructor via the <span style="color: #333333;">this</span> object.

This is an incredibly powerful tool. JavaScript lets you modify something’s prototype at any time in your program, which means you can add extra methods to existing objects at runtime:

<span class="token keyword">var</span> s <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">'Simon'</span><span class="token punctuation">,</span> <span class="token string">'Willison'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
s<span class="token punctuation">.</span><span class="token function">firstNameCaps</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// TypeError on line 1: s.firstNameCaps is not a function</span>

Person<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">firstNameCaps</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>first<span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
s<span class="token punctuation">.</span><span class="token function">firstNameCaps</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "SIMON"</span>

Interestingly, you can also add things to the prototype of built-in JavaScript objects. Let’s add a method to <span style="color: #333333;">String</span> that returns that string in reverse:

<span class="token keyword">var</span> s <span class="token operator">=</span> <span class="token string">'Simon'</span><span class="token punctuation">;</span>
s<span class="token punctuation">.</span><span class="token function">reversed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// TypeError on line 1: s.reversed is not a function</span>

String<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">reversed</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> r <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span>
  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    r <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> r<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

s<span class="token punctuation">.</span><span class="token function">reversed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// nomiS</span>

Our new method even works on string literals!

<span class="token string">'This can now be reversed'</span><span class="token punctuation">.</span><span class="token function">reversed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// desrever eb won nac sihT</span>