2012-10-30 24 views
4

這裏對齊是一個例子:的JavaScript數組排序與順序排列

  // 0  1  2  3  4 
var people = ['jack','jill','nancy','tom','cartman']; 
var order = [3,1,4,0,2]; 

// somehow sort people array to the order specified in the order array 

      // 3  1  4  0  2 
people == ['tom','jill','cartman','jack','nancy']; 

我以前使用的.sort具有的功能,但我仍然在這一個損失。

UPDATE

看到一些答案後,我簡直不敢相信這不是明顯對我。因爲有很多方法可以做到這一點,勝利者將由jsperf決定。

(有工作也回答我upvoting大家)

的比賽! http://jsperf.com/array-sorted-to-order-array3

+2

獲勝者應該首先確定可讀性和最清晰的意圖:) – alex

+0

性能優勝者沒有任何意義 –

+0

你真的需要排序現有的數組嗎?這裏的許多答案都取代了數組,而這可能是也可能不是你想要的。 –

回答

2

order是一組索引。因此,只需遍歷它,按照spcified的順序提取所需的值,製作一個新的數組。

var people = ['jack','jill','nancy','tom','cartman']; 
var order = [3,1,4,0,2]; 

var sorted = []; 
for (var i = 0; i < order.length; i++) { 
    var desiredIndex = order[i]; 
    sorted.push(people[desiredIndex]); 
} 

console.log(sorted); 
// ["tom", "jill", "cartman", "jack", "nancy"] 

有時排序不是「排序」。有時你需要通過從其他事物中提取數據來創建新事物。

+0

你贏得了jsperf性能基準,足夠奇怪 – Fresheyeball

+0

@Fresheyeball我不認爲這很奇怪。迴歸基本結構,例如'for'循環通常是最快的。 – alex

+0

@alex它不應該是。隨着圍繞地圖和縮小的所有宣傳,我認爲瀏覽器有一種優化這種操作的方法,遠遠超出了基本構造。 – Fresheyeball

6
sorted = [] 
order.forEach(function(i) { sorted.push(people[i]) }); 

,或者更看中的卻少可讀(IMO):

sorted = order.reduce(function(r, i) { 
    return r.concat([people[i]]) 
}, []); 
+0

更好的解決方案。 – enhzflep

+0

+1。什麼冠軍!!!!! – Tariqulazam

+3

我認爲alex的更清晰 –

1

我不知道,這樣的事情吧?

var people = ['jack','jill','nancy','tom','cartman']; 
var order = [3,1,4,0,2]; 


var result = [], i, n=order.length; 

for (i=0; i<n; i++) 
{ 
    result[ order[i] ] = people[i]; 
} 
4

只是另一種方式:)

people = order.map(function(value) { return people[value]; }); 

jsFiddle

+0

'.map()'是執行此操作的唯一方法。 –

+0

不錯........... – georg