2013-03-21 37 views
5

Tôi có một mảng với kích thước như thế này:Sorting một mảng theo thứ tự của mảng khác

var arr = [ 
    'small', 
    'small', 
    'small', 
    'small', 
    ... 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    ... 
    'big', 
    'big', 
    ... 
]; 

tôi cần phải sắp xếp lại mảng này theo thứ tự này:

var order = ['small', 'small', 'medium', 'medium', 'big']; 

Vì vậy, kết quả kết thúc là một cái gì đó như thế này:

var arr = [ 
    'small', 
    'small', 
    'medium', 
    'medium', 
    'big', 

    'small', 
    'small', 
    'medium', 
    'medium', 
    'big' 

    ... 
]; 

Tôi biết các câu hỏi tương tự khác trong SO nhưng tôi không thể tìm thấy bất kỳ thứ gì ing cho đến nay. Tôi không chắc chắn làm thế nào để tiếp cận này. Tôi đã suy nghĩ sort nên làm gì nhưng tôi phải làm gì để kiểm tra? Nó có vẻ đơn giản nhưng tôi bị mắc kẹt, không biết bắt đầu từ đâu. Bất kỳ gợi ý nào?

+0

Tôi nghĩ bạn cần hiển thị một ví dụ thực tế của mảng trước và sau. Ngay bây giờ tôi không thể nhìn thấy những gì làm cho mảng tách trên hai bộ bạn đang hiển thị trong đầu ra – mplungjan

+0

Tiêu đề: 'Sắp xếp mảng với một mảng' Chờ đợi những gì? –

+0

@Derek: Vui lòng chỉnh sửa, không biết cách xác định vấn đề này tốt hơn ... – elclanrs

Trả lời

1

Vâng, cuối cùng tôi đã kết thúc với giải pháp này mà làm việc:

function orderBy(arr, order) { 
    var result = [], 
     i = 0, len = arr.length, 
     index; 

    while (result.length < len) { 
    index = arr.indexOf(order[i]); 
    result.push(arr[index]); 
    arr.splice(index, 1); 
    i = i >= order.length-1 ? 0 : ++i; 
    } 

    return result; 
} 

Nó sửa đổi mảng gốc nhưng không sao.

Demo: http://jsbin.com/umizat/1/edit

+0

Tôi rất muốn biết ứng dụng thế giới thực này – mplungjan

+0

@mplungjan: Tôi có một lưới Masonry với Để tạo ra một lưới hoàn chỉnh (không có lỗ hoặc khoảng trống kỳ lạ), các hộp phải theo một mẫu nhất định (nhỏ, nhỏ, trung bình, trung bình, lớn). Đó là ý tưởng chung. một hộp tìm kiếm "vô hiệu hóa" thay vì trải qua tất cả những rắc rối này – elclanrs

+0

@elclanrs cũng damn, nếu tôi đã nhìn thấy điều này trước khi tôi sẽ không dành thời gian làm cho fiddle và chức năng của tôi> Jon

3

Chỉ cần xác định người ghi bàn cho phương pháp sắp xếp của bạn. Đây là mã của bạn. Thử

var init_arr = ['small', 'big', 'big', 'medium']; 

var scorer = { 
    small: 0, 
    medium: 1, 
    big: 2 
} 

// You can use the same array too. I am creating new one. 
var final_arr = init_arr.sort(function(a,b) { 
    return scorer[a]-scorer[b]; 
}); 

alert(final_arr); //small, medium, big, big 

Working Fiddle

+0

Rất đẹp, tốt hơn tôi +1. – gdoron

+0

@gdoron Vui vì bạn thích nó :) – sachinjain024

+2

Tôi e rằng đây không phải là kết quả mong muốn. Xem ví dụ. –

0

tại sao không bạn tạo ra 3 mảng và chia dữ liệu theo kích thước, sau đó bạn có thể lấy dữ liệu theo một thứ tự nhất định.

thích;

SMALL[]; 
MEDIUM[]; 
BIG[]; 

for(i,j,k : upto array lengths : i++,j++,k++){ 

    nwArray.add(SMALL[i]); 
    nwArray.add(SMALL[++i]); 
    nwArray.add(MEDIUM[j]); 
    nwArray.add(MEDIUM[++j]); 
    nwArray.add(BIG[k]); 

} 

return newArray; 
0

Cách tiếp cận của tôi sẽ lặp qua mảng thứ tự và kéo phần tử ra cho đến khi mảng trống hoặc không có phần tử bắt buộc.

var sorted = []; 
var arr = [ 
    'small', 
    'small', 
    'small', 
    'small', 
    ... 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    ... 
    'big', 
    'big', 
    ... 
]; 
var order = ['small', 'small', 'medium', 'medium', 'big']; 

out: 
while (true) { 
    for (var i = 0; i < order.length; i++) { 
    var index = arr.indexOf(order[i]); 
    if ((index === -1) or (arr.length === 0)) { 
     break out; 
    } else { 
     var elem = arr.splice(index, 1); 
     sorted.append(elem[0]); 
    } 
} 
1

Câu trả lời này chỉ có tác dụng đối với trường hợp chính xác mà bạn đã mô tả, tức là nơi chiều dài của mảng là bội thậm chí 5 và các giá trị đều được sắp xếp thành nhỏ, vừa và lớn và có rất nhiều gấp hai lần mỗi nhỏ và trung bình là lớn.

Nó có thể làm việc cho bất kỳ mảng được sắp xếp các giá trị nơi length % 5 == 0, nhưng kết quả có thể không muốn bạn muốn:

function reOrder(array) { 
    var result = []; 
    var f = array.length/5; // this must be an integer 
    var t; 

    for (var i=0; i<f; i++) { 
    t = i*2; 
    result.push.call(result, array.slice(t, t+2)); 
    t = f*2 + i*2; 
    result.push.call(result, array.slice(t, t+2)); 
    t = f*4 + i; 
    result.push.call(result, array.slice(t, t+1)); 
    } 
    return result; 
} 

var a = ['s','s','s','s','s','s','m','m','m','m','m','m','b','b','b']; 
alert(reOrder(a)); // s,s,m,m,b,s,s,m,m,b,s,s,m,m,b 
+0

+1 Điều này dường như làm việc cho trường hợp tôi mô tả, nhưng nó khá ngẫu nhiên vì vậy nó có thể không làm việc cho giải pháp dài hạn – elclanrs

0

Tôi biết câu hỏi này là cũ, và bạn có một câu trả lời bạn đang sử dụng, nhưng tôi muốn cung cấp lên ví dụ này và JSFiddle cho một giải pháp mà sẽ làm việc với bất kỳ loại sửa đổi bạn có thể kết thúc.

Lưu ý mọi thứ còn lại trong mảng ban đầu sẽ được thêm vào cuối mảng mới và không bị loại trừ. Nếu không có đủ các mục trong mảng để điền vào các yêu cầu của order, các phần tử bị thiếu sẽ bị bỏ qua khỏi đơn đặt hàng.

Bây giờ, với chức năng:

function mySort(arr, order) { 
    var newAr = []; 
    var orIndex = 0; 
    while(arr.length != 0) { 
     var type = order[orIndex]; 
     var ind = arr.indexOf(type); 
     if(ind != -1) { 
      newAr.push(type); 
      arr.splice(ind, 1); 
     } 
     orIndex++; 
     if(orIndex >= order.length) { 
      orIndex = 0; 
     } 
    } 
    return newAr; 
} 

Điều này không, là phải mất mảng dụ bạn:

var arrTest = [ 
    'small', 
    'small', 
    'small', 
    'small', 
    'small', 
    'small', 
    'small', 
    'small', 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    'medium', 
    'big', 
    'big', 
    'big', 
    'big', 
]; 
var orderTest = ['small', 'small', 'medium', 'medium', 'big']; 

Bây giờ, bạn có thể thay đổi các tất cả các bạn muốn, nhưng nó hoạt động tìm kiếm văn bản của chúng, vì vậy nếu bạn muốn nó được sắp xếp, hãy chắc chắn nó giống nhau trong cả mảng đầy đủ và mảng thứ tự. Bây giờ, để sử dụng chức năng, bạn sẽ làm gì:

var sortedArray = mySort(arrTest, orderTest); 

Hoặc, cho làm thế nào tôi chứng minh trong Fiddle:

alert(mySort(arrTest, orderTest).join('\n')); 

Và đó nên làm việc cho bất kỳ tình huống có liên quan đến hai và thứ tự có thể dễ dàng sửa đổi.

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan