2013-05-18 96 views
1

我正試圖動態構建一個多維數組。構建動態多維數組

我想動態構建它的原因是數組增長爲5個數字塊中的1 - 1000。
這將是非常耗費時間把它寫這樣的:

[1, 2, 3, 4, 5],,,,,[996, 997, 998, 999, 1000] 

我一直在掙扎今天一整天,所以我決定,因爲我現在完全陷入張貼了這個問題。

這就是我要動態地構建陣列(我先前的職位被解決):
Multi-dimensional array shuffle random

一旦動態數組被正確建立,我想調用fisherYates()與「outerArr功能。的forEach(fisherYates);」得到這樣的結果:

[4,2,3,5,1],[7,10,6,9,8],[11,15,12,14,13],[18,17,16,20,19],[22,21,25,23,24] 


的陣列將用於淡出/淡入畫面。
1.淡入第一組的五個隨機圖片1-5
2.淡出第一設定
3.淡入第二組五個隨機圖片6-10
4.淡出第二設定
5.淡入第三組五張胡亂圖片11-15
6.等等....

我會用數組值是這樣的:

$currImg = $('.rotator-image:visible', $currLi); 
$next = $('.img' + outerArr[a][b], $currLi); 
$currImg.fadeOut(1000); 
$next.fadeIn(1000); 

我試圖解決這個與這些鏈接的幫助:
jQuery.map
Create multidimentional array with dynamic form
尖尖的代碼this post

一些注意事項:我不喜歡使用的"var outerArr = new Array();"。我讀somwhere時應該避免(?)。我想用jQuery的方式完成這個工作,如果可能的話,用.push和$ .makeArray(和$ .map)。然而,任何方法表示讚賞。

下面是代碼我有(增加的jsfiddle JavaScript的窗口中看到我的意見):(也here

function fisherYates(myArray) { 
    var i = myArray.length, j, tempi, tempj; 
    if (i === 0) return false; 
    while (--i) { 
     j = Math.floor(Math.random() * (i + 1)); 
     tempi = myArray[i]; 
     tempj = myArray[j]; 
     myArray[i] = tempj; 
     myArray[j] = tempi; 
    } 
} 

var outerArr = []; 
var innerArr = []; 
var fakeArr = 0; 
var zz = 0; 

for (var z = 1; z < 26; ++z) { 
    ++zz; 
    if (zz != 5) { 
     fakeArr = fakeArr + z + ","; 
    } else { 
     fakeArr = fakeArr + z; 
     var realArr = $.makeArray(fakeArr); 
     innerArr.push(realArr); 
     outerArr.push(innerArr); 
     innerArr = []; 
     innerArr.length = 0; 
     fakeArr = ""; 
     fakeArr.length = 0; 
     zz = 0; 
    } 
} 
// Shuffle/Randomize the numbers in each chunk but not the order of the five chunks 
outerArr.forEach(fisherYates); 
alert(outerArr); 

問題是,當我想從陣列獲取值。我沒有得到單個值(比如outerArr [1] [3]應該顯示9)。我只得到每個完整的塊(如6,7,8,9,10)。我相信我必須使用$ .map,但我不知道如何使用$ .map作爲示例。洗牌/隨機功能(即outerArr.forEach(fisherYates);)無法正常工作,因爲代碼是現在。

數組也應隨機(如在頂部的第一個鏈接解釋),但我應該能夠獲得隨機播放/隨機的工作,一旦我得到的動態部分的工作。

+0

'$ .makeArray(fakeArr)'是不是做你彷彿覺得它是。它期望一個對象作爲輸入,而不是一個字符串。 – nnnnnn

+0

謝謝。好的,這解釋了它。我可能不得不看另一種方法,比如Michael Geary用Lo-Dash的建議。 – ironarrow

回答

0

在用戶Michael Geary和nnnnnn的幫助下,他們以前回答了我的問題,並在四處搜索後得到了解決方案。我在this發現了一段幫助我的代碼。

我一直在尋找的代碼看起來像這樣。也發佈在 JSFiddle的評論。請展開JSFiddle JavaScript窗口以進行長篇評論。

function fisherYates(myArray) { 
    var i = myArray.length, j, tempi, tempj; 
    if (i === 0) return false; 
    while (--i) { 
     j = Math.floor(Math.random() * (i + 1)); 
     tempi = myArray[i]; 
     tempj = myArray[j]; 
     myArray[i] = tempj; 
     myArray[j] = tempi; 
    } 
} 

var outerArr = []; 
var innerArr = []; 
var f = 0; 

for (var z = 1; z < 27; ++z) { 
    ++f; 
    if (f <= 5) { 
     innerArr.push(z); 
    } else { 
     outerArr.push(innerArr); 
     innerArr = []; 
     f = 0; 
     --z; 
    } 
} 

alert(outerArr); 
outerArr.forEach(fisherYates); 
alert(outerArr); 
alert(outerArr[0][0]); 
alert(outerArr[4][4]); 

因爲我沒有信譽15我不能+1邁克爾·吉爾的回答

1

你真是在錯誤的軌道與你應該使用jQuery做到這一點的想法上。這種代碼不像jQuery擅長的那樣。jQuery是一個DOM操作庫,而不是這種編碼的通用JavaScript庫。

如果你想要一個對這些類型的數組操作很有用的庫,一個好的開始的地方是underscore.js或類似但更新的Lo-Dash。這些庫具有各種數組和對象操作功能。最好查看這兩個庫的文檔,看看它們是否有用。 (閱讀完文檔後,如果你不確定要選哪一個,那麼你不會有任何問題,但我的建議是Lo-Dash。)

否則,你應該簡單地編寫純粹的JavaScript代碼,與老式的循環和這樣的事情。

一些說明:我不喜歡使用var outerArr = new Array();。我讀somwhere時應該避免(?)。

您正在使用的是var outerArr = [];。這很好,而且現在確實是推薦的做法。但這只是一個美容方面的差異。 new Array()[]表示完全一樣的東西,並且工作方式相同。將其中一個更換爲另一個不會導致任何問題或解決任何問題。

另外,代碼中的縮進是一團糟。不可能知道哪些語句嵌套在內部。所以我冒昧清理壓痕。請檢查它並確保我的判斷正確。

我看到你的代碼中有一個fisherYates()函數,但是這個函數永遠不會被調用。不知道這是關於什麼的,也許你可以澄清。

什麼是假數組?爲什麼你需要一個假數組和真實數組?

這段代碼有兩個語句什麼都不做:

innerArr = []; 
    innerArr.length = 0; // does nothing 
    fakeArr = ""; 
    fakeArr.length = 0; // does nothing 

兩個innerArrfakeArr已經有一個長度爲零,因爲它們的值分別爲[]"",所以沒有必要設置length再次爲零。

還有一個最後的建議:或許不要試圖立即寫出JavaScript代碼,而應該用英文寫出 - 細節 - 確切地說輸入是什麼,輸出是什麼以及你認爲哪些步驟會得到你在那裏。您在發佈的描述中有一部分內容,但缺少很多詳細信息。如果您可以用英文或僞代碼寫出所有這些詳細信息,可以幫助您更輕鬆地編寫實際的代碼。

我知道這並不回答你的問題,但它應該給你思考! :-)

+0

謝謝你的「DOM操作」擡頭。我現在更瞭解它。我會看看Lo-Dash。 對不起,關於縮進。感謝編輯,它現在看起來非常好。 我原來的問題是如何使動態數組,而不是如何洗牌,所以我更新了我的帖子了一下....(由於字符輸入限制,繼續在下一個答案) – ironarrow

+0

...繼續... 目前我正在尋找合適的域名。一旦我擁有了它, 我會發佈一個鏈接到完整的例子,並在'辛苦的細節 - 用英語'的完整解釋。 當我在論壇上提問時,我完全理解完整解釋的價值。 你說,你沒有回答我的問題,但你給我,作爲一個有點新手程序員,我很欣賞很有價值的信息 。謝謝! – ironarrow

+0

關於假陣列。我從這裏得到了這個:http://api.jquery.com/jQuery.map/ – ironarrow