2013-08-19 33 views
1

我目前有這個函數按字母順序排列數組。Javascript自定義數組排序按陣列

function compare(a,b) { 
    if (a.subtitle < b.subtitle) 
     return -1; 
    if (a.subtitle > b.subtitle) 
     return 1; 
     return 0; 
} 

我需要類似的功能的排序由另一個陣列的方向。我試圖自己寫,但我無法繞過它,所以我沒有結果。

例子:

我需要陣列1不同的地方該項目是在數組2進行排序。

Array1 = ['quick','fox','the','brown']; 
Array2 = ['the','quick','brown','fox']; 

有可能是一個簡單的答案,我沒有看到。

編輯:

而且是在ARRAY1不在陣列2的任何項目剛好可以上漲到結束沒有特定的順序或字母順序無論是更容易。

+0

請注意,'返回0;'是這裏的默認值,並且縮進是欺騙性的。出於這個原因,在javascript中使用if語句的大括號。 – dwerner

回答

2

試試這個:

function compare(a,b, compareArray) { 
    if ((compareArray.indexOf(a) != -1 && compareArray.indexOf(a) < compareArray.indexOf(b)) 
     || compareArray.indexOf(b) == -1) 
     return -1; 
    if ((compareArray.indexOf(a) > compareArray.indexOf(b)) 
     || compareArray.indexOf(a) == -1) 
     return 1; 
     return 0; 
} 
+0

哪個數組是compareArray? – Mattigins

+0

在你的問題中,'compareArray'就是'Array2'。 – manuskc

+1

這很好,但是您應該爲快速查找創建索引映射。 – plalx

0

http://jsfiddle.net/AMSDE/

var Array1 = ['quick', 'fox', 'the', 'brown', 'abc']; //the array to be sorted 
var Array2 = ['the', 'quick', 'brown', 'fox']; 
var sortedAry = []; 

for (var i = 0; i < Array2.length; i++) { 
var index = Array1.indexOf(Array2[i]); 
if (index !== -1) { 
    console.log(index); 
    sortedAry.push(Array2[i]); 
    Array1.splice(index, 1); 
} 
} 

for (var j = 0; j < Array1.length; j++) { 
sortedAry.push(Array1[j]); 
} 

console.log(sortedAry); 
0

我碰到需要今天做同樣的事跑了,這是我的解決方案:

var arr = [".", 5359, 1, 2, 3, 4, 6, 9, 15]; 
var priorities = [3, '.', 1, 4, 15, 9, 2, 6]; 

var resultArr = arr.filter(function(arrElement) { return priorities.indexOf(arrElement) >= 0 }) 
    .sort(function (a,b) { return priorities.indexOf(a) - priorities.indexOf(b) }) 
    .concat(arr.filter(function(arrElement) { return priorities.indexOf(arrElement) < 0}) 
); 

console.log(resultArr.join("")); 

控制檯:3.14159265359

jsfiddle based on @rps's answer

基本上,它挑選出我們有首選訂單的要素,對它們進行排序,然後附加我們沒有訂單偏好的要素。作爲獎勵(至少在我的用例中),排序對arr的順序是無損的。

我不確定這是好還是壞,但我知道我討厭for循環。 :)