![](/img/trans.png)
[英]Can someone tell me why .checked function isn't firing in javascript?
[英]Can someone tell me why this JavaScript code isn't lining up an array in order?
實時代碼: http : //jsfiddle.net/fCUZC/
//INPUT ARRAY:
var input = [28,32,21,11,8,2,14,32,64];
//VARIABLE DECLARATION. a = highest number so far, b = position of that number
entireLoop:
for (var i = 1; i<=input.length; i++)
{
if(input[i] > input[i-1])
{
for(var o = i; o>=0; o--)
{
if(input[i-1] > input[o])
{
input.splice(i,0,input[o]);
input.splice((o+1),1);
continue entireLoop;
}
else if(input[o] > input[0])
{
input.splice(0,0,input[o]);
input.splice((o+1),1);
continue entireLoop;
}
}
}
}
document.write(input);
我正在嘗試從最大到最小排序數組,但是某個地方有32個數組。 我知道有排序方法,但是我是新手,想親自嘗試一下。
**編輯**首先看一下數組的本機.sort()方法。 它保持原始數組不變,並接受比較函數。 后者使.sort()變得非常強大。
var input = [28,32,21,11,8,2,14,32,64];
var low2high = function ( a , b ) {
return a > b;
};
var high2low = function ( a , b ) {
return a < b;
};
var resultHigh2low = input.sort( high2low ); // [ 64,32,32,28,21,14,11,8,2 ];
var resultLow2high = input.sort( low2high ); // [ 2,8,11,14,21,28,32,32,64 ];
因此,如果我們要使用bubbleSort(TJ Crowder提供的鏈接,請參閱OP注釋),我們可以編寫以下內容:
// javascript bubbleSort implementation
var bubbleSort = function ( list , comparison ) {
var swapped;
var i;
var val;
list = [].concat( list ); // do not destroy original
comparison = ( typeof comparison == "function" ) ? comparison : function(a,b){return a > b;}
do {
i = list.length;
while ( --i ) {
if ( i && comparison( list[ i ] , comparison[ i-1] ) ) {
val = list[ i ];
list[ i ] = list[ i - 1 ];
list[ i - 1] = val;
swapped = true;
}
}
} while ( swapped );
return list;
}
// using comparison functions from previous example.
var resultHigh2low = bubbleSort( input , high2low ); // [ 64,32,32,28,21,14,11,8,2 ];
var resultLow2high = bubbleSort( input , low2high ); // [ 2,8,11,14,21,28,32,32,64 ];
讓我們逐步介紹它:
var bubbleSort = function ( list , comparison ) {
..code..
}
我們的函數接受2個參數,第一個是數組,第二個是可選的比較函數。
var swapped;
var i = list.length;
var val;
我們將列表的長度存儲在變量i
,並聲明2個空變量( swapped
和val
),稍后我們將使用它們。
list = [].concat( list ); // do not destroy original
我們使用[].concat( array )
克隆列表,並覆蓋本地list
變量,而保持原始狀態不變。
comparison = ( typeof comparison == "function" ) ? comparison : function(a,b){return a > b;}
我們測試typeof
的comparison
論證,如果它是一個function
,我們使用的是一個,否則我們依傍我們自己的comparison
功能。 如果a
大於b
我們的后備比較函數將返回true
。
do {
..code..
} while ( swapped );
do / while循環將至少運行一次,我們的swapped
變量當前undefined
因此將被解釋為虛假。 如果我們的comparison
函數返回true,則會發生交換,並且swapped
變量將被設置為true,因此它將再次循環。
while ( --i ) {
..code..
}
在這里,我從列表的長度開始向下循環,將--
運算符放在i
變量之前,以確保首先在任何變量之前對其進行處理;由於list[ list.length ]
不存在,因此while
評估會導致錯誤的結果之后i--
將關閉。 我總是這樣做(可能是壞習慣),但是如果讓您感到困惑,請絕對透明。
if ( i && comparison( list[ i ] , comparison[ i-1] ) ) {
..code..
}
首先,我們檢查i
是否具有真實值(0等於falsy),然后運行comparison
函數,將list[ i ]
和list[ i - 1 ]
作為a
和b
參數傳遞。 如果comparison
函數返回true
,則執行交換。
val = list[ i ];
list[ i ] = list[ i - 1 ];
list[ i - 1] = val;
swapped = true;
在這里,我不使用.splice()
方法執行交換,這只是有根據的猜測atm。但是我認為直接分配比函數調用要快。 我使用val
變量作為占位符。 交換完成后,我將swapped
設置為true,這樣我們的do / while循環將繼續。
return list;
好吧...返回結果。
我已經排除了一些檢查,例如當列表的長度為0時我們做什么。 基本上,在編寫輔助函數時,我們還需要處理錯誤處理。 例如,當傳遞的比較參數不是函數時引發TypeError,例如,確保比較方法返回布爾值,依此類推。
//INPUT ARRAY:
var input = [28,32,21,11,8,2,14,32,64];
//VARIABLE DECLARATION. a = highest number so far, b = position of that number
for (var i = 1; i<input.length; i++)
{
if(input[i] > input[i-1])
{
for(var o = i-1; o>=0; o--)
{
if(input[i] > input[o])
{
input.splice(i+1,0,input[o]);
input.splice((o),1);
i--;
}
}
}
}
document.write(input);
雖然它仍然不是很好,但它應該可以工作。 請記住,我幾乎沒有對此進行測試,並且對JavaScript缺乏經驗。 您的意圖並不都是壞事,每個人都需要從某個地方開始。
最大的問題僅僅是內部條件。 我可以看到您的邏輯,即從找到的較大值向后循環,然后將所有較小的值向右推。 不幸的是,您的索引有些不足。 您還需要運行此循環,直到它正常結束為止,而不是繼續進行,否則,您將只切換一個值。 固定此條件后,不再需要第二個條件
另一種形式是從最低的索引開始,然后找到小於input [i]的第一個值,然后將其放在那里。 這可能更清楚。
我認為這是一個很好的第一槍,並且開始工作並不難。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.