получить номер обратного порядка данной серии - PullRequest
1 голос
/ 06 августа 2011

Я хочу получить номер обратного порядка данной серии в javascript.Если у меня есть следующие серии:

[1,2,2,2,5,5,7,8,8,10]

, тогда, если входное число равно 8, выходное значение должно быть 2, так как:

 1  = 10
 2  = 7
 2  = 7
 2  = 7
 5  = 5
 5  = 5
 7  = 4
[8  = 2]
[8  = 2]
 10 = 1
//--> [1 , 2,3,4, 5,6, 7, 8,9, 10]
  --> [1 , 2,2,2, 5,5, 7, 8,8, 10]
      [10, 7,7,7, 5,5, 4, 2,2, 1 ] <-- // ==> [1,2,2,4,5,5,7,7,7,10]

Вот чтоЯ сделал до сих пор:

function getReverseNumber(arr, num)
{
    var newArr = new Array(arr.length);
    var temp;
    var counter = 1;
    for(var i = arr.length; i > 0; i--)
    {
        if(temp === arr[i])
        {
            newArr[arr.length - i] = counter;
            continue;
        }
        newArr[arr.length - i] = counter;
        temp = arr[i];
        counter++;
    }
    return newArr[num - 1];
}

, но он не работает должным образом:

getReverseNumber(new Array(1,2,2,2,5,5,7,8,8,10), 8) // returns 5 not 2

что не так в моей функции?

Ответы [ 4 ]

1 голос
/ 06 августа 2011

Работает в IE6 даже ;)

function getReverseNumber(arr,num){
    alert(arr[ arr.length + arr.indexOf(num) * -1  ]);
}

getReverseNumber(new Array(1,2,2,2,5,5,7,8,8,10), 8); // alerts 2

Рабочая демоверсия: http://jsfiddle.net/AlienWebguy/7qvzE/

1 голос
/ 06 августа 2011

Я думаю, что вы это усложняете.Вы только увеличиваете counter на единицу, когда увеличиваете его, и вы размещаете числа в порядке, так что newArr заканчивается как [1,2,2,3,4,4,5,5,5,6] вместо [10,7,7,7,5,5,4,2,2,1].

Нет необходимостирассчитать все эти числа и сохранить в массиве.Просто сделайте цикл от 1 и выше и вычислите, какая позиция находится в массиве.Вернуть индекс, когда вы найдете значение:

function getReverseNumber(arr, num) {
  for (var i = 1; i <= arr.length; i++) {
    if (arr[arr.length - i] == num) return i;
  }
  return -1; // not found
}

Демо: http://jsfiddle.net/Xedz6/

1 голос
/ 06 августа 2011

скрипка протестирована в IE 8 и 7 наслаждайся

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
    "use strict";
    if (this === void 0 || this === null) {
        throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0) {
        return -1;
    }
    var n = 0;
    if (arguments.length > 0) {
        n = Number(arguments[1]);
        if (n !== n) { // shortcut for verifying if it's NaN
            n = 0;
        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
    }
    if (n >= len) {
        return -1;
    }
    var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
    for (; k < len; k++) {
        if (k in t && t[k] === searchElement) {
            return k;
       }

    }

    return -1;

  }

}


...

arr[ Math.Abs(arr.indexOf(num)-arr.length-1)]

извините за форматирование. Я на своем телефоне.

0 голосов
/ 06 августа 2011

check lastIndexOf

a = [1,2,2,2,5,5,7,8,8,10]
n = a.lastIndexOf(8)
alert(a.length - n)

Относительно этих замечаний "IE8" - даже если речь идет об устаревших браузерах, это не оправдание для повторного изобретения колеса.Используйте стандартные документированные функции библиотеки javascript и, при необходимости, включайте слои совместимости / деградации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...