2015-08-04 1 views
-2

lastIndexOf_.lastIndexOf (array, value, [fromIndex]) Возвращает индекс последнего вхождения значения в массив или -1, если значение нет. Перейдите изIndex, чтобы начать поиск по заданному индексу.как реализовать lastIndexOf (массив, значение, [fromIndex]) функция в javascript

_.lastIndexOf ([1, 2, 3, 1, 2, 3], 2); => 4

мой код:

function lastIndexOf(array,value){ 
 
\t 
 
\t var temp=[]; 
 
\t for(var i=0;i<array.length;i++){ 
 
\t \t if(array[i]==value){ 
 
\t \t \t return i; 
 
\t \t } 
 
     return -1; 
 
\t } 
 
\t 
 
} 
 

 
console.log(lastIndexOf([1, 2, 3, 1, 2, 3],2));

+0

Почему вы тег 'underscore.js'? – thefourtheye

+0

это функция underscore.js –

+0

http://underscorejs.org/#lastIndexOf –

ответ

0

почему вы не использовать стандартную функцию Javascript lastIndexOf, который работает отлично с массивами?

[1, 2, 3, 1, 2, 3].lastIndexOf(2) 

результаты

4 

почему вы должны изобрести горячую воду снова?

РЕДАКТИРОВАТЬ:

сделал это изменение для «изобретателей», чтобы не изобрести снова декрементной петли

function lastIndexOf(array,value) { 

    for(var i=array.length;i>0;i--){ 
     if(array[i]==value) return i; 
    } 
    return -1; 
} 
+0

я изобретаю функцию lastIndexOf не используя. –

+0

@AmitModi Вероятно для обратной совместимости, поскольку бесконечный IE8 [не поддерживает большинство функций Array] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf), который мы считаем само собой разумеющимся. – zero298

+0

ОК, для изобретателей я сделал редактирование и поместил рабочий код для недавно изобретенного lastIndexOf :) – Reflective

-1

Во-первых, обратный для цикла.

Во-вторых, lastIndex не имеет смысла, вы смотрите с этого места назад? если это так, было бы довольно легко реализовать. Просто взгляните с этого места на начало i.

function lastIndexOf(array,value){ 
 
\t 
 
\t var temp=[]; 
 
\t for(var i=array.length-1;i>=0;i--){ 
 
\t \t if(array[i]==value){ 
 
\t \t \t return i; 
 
\t \t } 
 
\t } 
 
    return -1; 
 
} 
 

 
console.log(lastIndexOf([1, 2, 3, 1, 2, 3],2));

+0

, но вывод -1 –

+0

Да, возврат -1 был не в том месте. –

-1
function lastIndexOf(array,value){ 

    var temp; 
    for(var i=0;i<array.length;i++){ 
     if(array[i]==value){ 
      temp = i; 
     } 
    } 
    if (temp) return temp; 
    return -1; 
} 
+0

это правильный ответ –

+0

Нет, это не так. Ответчик не потрудился проверить это, и, очевидно, и вы тоже. –

0

Взятые из ECMA-262 5.1 Edition/June 2011, Page 133-134, глава 15.4.4.15 Array.prototype.lastIndexOf (searchElement [, fromIndex]). Собственные комментарии указаны.

function lastIndexOf(O, searchElement, fromIndex) { 
 
    var len, n, k, kPresent, elementK; 
 
    // 1. Let O be the result of calling ToObject passing the this value as the argument. 
 
    // ninascholz: given as parameter 
 
    // 2. Let lenValue be the result of calling the [[Get]] internal method of O with the argument "length". 
 
    // ninascholz: given as parameter 
 
    // 3. Let len be ToUint32(lenValue). 
 
    len = O.length; 
 
    // 4. If len is 0, return -1. 
 
    if (len === 0) { 
 
     return -1; 
 
    } 
 
    // 5. If argument fromIndex was passed let n be ToInteger(fromIndex); else let n be len-1. 
 
    n = parseInt(fromIndex) || len - 1; 
 
    // 6. If n = 0, then let k be min(n, len – 1). 
 
    // ninascholz: should read n >= 0, otherwise the else condition would be wrong 
 
    if (n >= 0) { 
 
     k = Math.min(n, len - 1); 
 
    } else { 
 
     // 7. Else, n < 0 
 
     // a. Let k be len - abs(n). 
 
     k = len - Math.abs(n); 
 
    } 
 
    // 8. Repeat, while k= 0 
 
    while (k >= 0) { 
 
     // a. Let kPresent be the result of calling the [[HasProperty]] internal method of O with argument ToString(k). 
 
     kPresent = k in O; 
 
     // b. If kPresent is true, then 
 
     if (kPresent) { 
 
      // i. Let elementK be the result of calling the [[Get]] internal method of O with the argument ToString(k). 
 
      elementK = O[k]; 
 
      // ii. Let same be the result of applying the Strict Equality Comparison Algorithm to searchElement and elementK. 
 
      if (searchElement === elementK) { 
 
       // iii. If same is true, return k. 
 
       return k; 
 
      } 
 
     } 
 
     // c. Decrease k by 1. 
 
     k--; 
 
    } 
 
    // 9. Return -1. 
 
    return -1; 
 
} 
 

 
function out(s) { var n = document.createElement('div'); n.innerHTML = s + '<br>'; document.getElementById('out').appendChild(n); } 
 

 
// 4. If len is 0, return -1. 
 
out(lastIndexOf([], 'e', -2)); // -1 
 
out([].lastIndexOf('e', -2)); // -1 
 

 
// 6. If n = 0, then let k be min(n, len – 1). 
 
out(lastIndexOf(['a', 'b', 'c', 'd', 'e'], 'c', 10)); // 4 
 
out(['a', 'b', 'c', 'd', 'e'].lastIndexOf('c', 10)); // 4 
 

 
// 7. Else, n < 0 
 
out(lastIndexOf(['a', 'b', 'c', 'd', 'e'], 'e', -2)); // -1 
 
out(['a', 'b', 'c', 'd', 'e'].lastIndexOf('e', -2)); // -1 
 

 
out(lastIndexOf(['a', 'b', 'c', 'd', 'e'], 'e', -1)); // 4 
 
out(['a', 'b', 'c', 'd', 'e'].lastIndexOf('e', -1)); // 4 
 

 
// ii. Let same be the result of applying the Strict Equality Comparison Algorithm to searchElement and elementK. 
 
out(lastIndexOf([0, 1, 2, 3, 4, 5], '5')); // -1 
 
out([0, 1, 2, 3, 4, 5].lastIndexOf('5')); // -1 
 

 
out(lastIndexOf(['a', 'b', 'c', 'd', 'e'], 'e', 2)); // -1 
 
out(['a', 'b', 'c', 'd', 'e'].lastIndexOf('e', 2)); // -1 
 

 
// iii. If same is true, return k. 
 
out(lastIndexOf(['a', 'b', 'c', 'd', 'e'], 'e')); // 4 
 
out(['a', 'b', 'c', 'd', 'e'].lastIndexOf('e')); // 4
<pre id="out"></pre>

Смежные вопросы