2010-03-14 53 views
55

Nói, tôi có một mảng mà trông như thế này:mảng Sắp xếp lại

var playlist = [ 
    {artist:"Herbie Hancock", title:"Thrust"}, 
    {artist:"Lalo Schifrin", title:"Shifting Gears"}, 
    {artist:"Faze-O", title:"Riding High"} 
]; 

Làm thế nào tôi có thể di chuyển một yếu tố đến vị trí khác?

Tôi muốn di chuyển ví dụ: {artist:"Lalo Schifrin", title:"Shifting Gears"} đến cuối.

tôi đã cố gắng sử dụng mối nối, như thế này:

var tmp = playlist.splice(2,1); 
playlist.splice(2,0,tmp); 

Nhưng nó không hoạt động.

+3

gì "không hoạt động" có nghĩa là - nó ném ra một lỗi, nó thay đổi gì cả, nó thay đổi mảng của bạn trong một cách mà bạn không có ý định? Có vẻ hợp lý với tôi. –

Trả lời

2

Thay đổi 2-1 là tham số đầu tiên trong các cuộc gọi mối nối khi loại bỏ các yếu tố:

var tmp = playlist.splice(1,1); 
playlist.splice(2,0,tmp); 
+0

phải là playlist.splice (2,0, tmp [0]); Đúng? – Crisboot

2

Bạn luôn có thể sử dụng các phương pháp sắp xếp, nếu bạn không biết nơi mà các kỷ lục có mặt tại địa chỉ:

playlist.sort(function (a, b) { 
    return a.artist == "Lalo Schifrin" 
       ? 1 // Move it down the list 
       : 0; // Keep it the same 
}); 
+1

Thông minh. Tôi thích nó. – Gaelan

+0

Điều gì về 'return + (a.artist ==" Lalo Schifrin ")' – Funkodebat

+1

@ Funko bạn có thể làm điều đó, nếu bạn thích ngắn gọn hơn độ dài. –

15

Nếu bạn biết các chỉ số bạn có thể dễ dàng trao đổi các yếu tố, với một chức năng đơn giản như thế này:

function swapElement(array, indexA, indexB) { 
    var tmp = array[indexA]; 
    array[indexA] = array[indexB]; 
    array[indexB] = tmp; 
} 

swapElement(playlist, 1, 2); 
// [{"artist":"Herbie Hancock","title":"Thrust"}, 
// {"artist":"Faze-O","title":"Riding High"}, 
// {"artist":"Lalo Schifrin","title":"Shifting Gears"}] 

Chỉ mục mảng chỉ là các thuộc tính của đối tượng mảng, vì vậy bạn có thể trao đổi các giá trị của nó.

137

Cú pháp của Array.splice là:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX); 

đâu:

  • index là vị trí trong mảng bạn muốn bắt đầu loại bỏ các yếu tố từ
  • howmany là bao nhiêu các yếu tố bạn muốn xóa khỏi chỉ số chỉ số
  • element1, ..., elementX là các phần tử bạn muốn chèn từ vị trí chỉ mục.

Điều này có nghĩa là splice() có thể được sử dụng để xóa phần tử, thêm thành phần hoặc thay thế các phần tử trong một mảng, tùy thuộc vào đối số bạn vượt qua.

Lưu ý rằng nó trả về một mảng các phần tử đã xóa.

Something đẹp và chung sẽ là:

Array.prototype.move = function (from, to) { 
    this.splice(to, 0, this.splice(from, 1)[0]); 
}; 

Sau đó, chỉ cần sử dụng:

var ar = [1,2,3,4,5]; 
ar.move(0,3); 
alert(ar) // 2,3,4,1,5 

Diagram:

Algorithm diagram

+9

Đây là câu trả lời hay và mối nối() trong một mối nối() thực hiện tốt công việc. Cần lưu ý, tuy nhiên, việc thêm một phương thức move() vào nguyên mẫu Array được gọi là "Monkey Patching" và thường được coi là thực hành không tốt. http://stackoverflow.com/questions/5741877/is-monkey-patching-really-that-bad –

1

Hãy thử điều này:

playlist = playlist.concat(playlist.splice(1, 1)); 
1

Nếu bạn chỉ bao giờ muốn di chuyển một mục từ một vị trí tùy ý để cuối của mảng, điều này sẽ làm việc:

function toEnd(list, position) { 
    list.push(list.splice(position, 1)); 
    return list; 
} 

Nếu bạn muốn di chuyển nhiều mục từ một số vị trí tùy ý để cuối cùng, bạn có thể làm:

function toEnd(list, from, count) { 
    list.push.apply(list, list.splice(from, count)); 
    return list; 
} 

Nếu bạn muốn di chuyển nhiều mục từ một số vị trí tùy ý để một số vị trí tùy ý, hãy thử:

function move(list, from, count, to) { 
    var args = [from > to ? to : to - count, 0]; 
    args.push.apply(args, list.splice(from, count)); 
    list.splice.apply(list, args); 

    return list; 
} 
5

Dưới đây là một phiên bản bất biến đối với những người quan tâm:

function immutableMove(arr, from, to) { 
    return arr.reduce((prev, current, idx, self) => { 
    if (from === to) { 
     prev.push(current); 
    } 
    if (idx === from) { 
     return prev; 
    } 
    if (from < to) { 
     prev.push(current); 
    } 
    if (idx === to) { 
     prev.push(self[from]); 
    } 
    if (from > to) { 
     prev.push(current); 
    } 
    return prev; 
    }, []); 
} 
+0

Xin chào, bạn có thể giải thích cho tôi những lợi ích của chức năng này qua câu trả lời ở trên không? – Xogno

+0

Giải pháp này không sửa đổi phần tử gốc nhưng trả về một mảng mới với mục nhập đang được di chuyển. – chmanie

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