2011-08-06 44 views
1

我想要在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 

我的功能出了什麼問題?

+0

什麼是所期望的輸出,如果該輸入是2,其中兩個7和8相匹配? – JYelton

+0

如果輸入是「2」,那麼輸出是「7」 –

+2

你的解釋讓我困惑,爲什麼如果輸入的數字是2就是答案總是7?如果你得到相反的順序,那麼2將分別對應於[8,8,7]。你有錯字嗎? –

回答

1

我認爲你過於複雜。當你增加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/

+0

爲什麼函數返回'not found'? –

+0

@End.Fouad:只有在數組中找不到數字時纔會返回,例如,如果您要調用'getReverseNumber([1,2,3],42)'。 – Guffa

+0

這完美的作品。感謝隊友:) –

0

退房lastIndexOf

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

對於這些「IE8」的言論 - 即使處理過時的瀏覽器,這不是重新發明輪子的藉口。使用標準的記錄的JavaScript庫函數,並在適當的時候包含兼容性/降級層。

+0

不過,在IE 8或更早版本中不起作用。 – Guffa

+0

它給了我一個錯誤:'對象不支持這個屬性或方法' –

+0

@stereofrog我做 –

1

fiddle在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

雖然在IE 8或更早版本中不起作用。 – Guffa

+0

@Guffa,哎,它可以在IE8和更早的版本中使用,下面的文章中的原型很容易:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf – Joe

+0

'getReverseNumber([1, 2,2,2,5,5,7,8,8,10],2)'return 10 not 7 –

1

工程在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/

+0

我不知道爲什麼'arr.indexOf(num)'給了我同樣的錯誤'對象不支持這個屬性或方法' –

+0

嗯工作正常我在IETester ie6,7和8.我知道舊IE瀏覽器不喜歡JSFiddle。嘗試一個本地例子。 – AlienWebguy

+0

據此,在IE6中不存在'indexOf':https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf – Guffa