2013-02-05 24 views
16

Tôi đang cố gắng như sau:Có cách nào để sử dụng Array.splice trong javascript với tham số thứ ba là một mảng không?

var a1 = ['a', 'e', 'f']; // [a, e, f] 
var a2 = ['b', 'c', 'd']; // [b, c, d] 
a1.splice(1, 0, a2);  // expected [a, b, c, d, e, f] 
          // actual (a, [b, c, d], e, f] 

tôi chỉ giới hạn trong trường hợp sử dụng của tôi bằng cách a2 tồn tại như một mảng có kích thước indeterminant. Có ai biết một cách để nuôi ghép một mảng như sự thay thế, hoặc cách khác là một chức năng được xây dựng trong để làm điều này? Tôi biết tôi có thể lặp qua các phần tử của a2 và ghép chúng trong một lần, nhưng tôi thích phương pháp nhanh nhất có thể bởi vì tôi sẽ cần phải làm điều này rất nhiều.

Trả lời

30

Array.splice hỗ trợ nhiều đối số sau hai đối số đầu tiên. Tất cả các đối số đó sẽ được thêm vào mảng. Biết được điều này, bạn có thể sử dụng Function.apply để chuyển mảng thành danh sách đối số.

var a1 = ['a', 'e', 'f']; 
var a2 = ['b', 'c', 'd']; 

// You need to append `[1,0]` so that the 1st 2 arguments to splice are sent 
Array.prototype.splice.apply(a1, [1,0].concat(a2)); 
+0

Perfect, cảm ơn bạn. – CoryG

+0

Bạn được chào đón! :-) –

+0

Thực sự kiểu dáng đẹp. Chỉ cần những gì tôi cần, cảm ơn! – 1252748

1

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

var params = a2.slice(0); 
params.unshift(1,0); 
a1.splice.apply(a1,params); 

Trong trường hợp tổng quát hơn:

Array.prototype.splice_multi = function(offset,todelete,insert) { 
    var params = insert.slice(0); 
    params.unshift(offset,todelete); 
    return this.splice.apply(this,params); 
}; 
a1.splice_multi(1,0,a2); 
+0

Bạn không cần truyền 2 đối số cho 'splice.apply'? –

+0

Tôi thực sự. Lỗi của tôi. –

3
var a1 = ['a', 'e', 'f'], 
    a2 = ['b', 'c', 'd']; 

a1.splice(1, 0, a2); 

var flatten = [].concat.apply([], a1); // ["a", "b", "c", "d", "e", "f"] 
2

này nên làm các trick.

var a1 = ['a', 'e', 'f']; 
var a2 = ['b', 'c', 'd']; 

a1.concat(a2, a1.splice(1,a1.length-1)) // [a, b, c, d, e, f] 
0
Array.prototype.splice.apply([1,2,3], [2, 0].concat([4,5,6])); 
0
private moveElements(source: Array<any>, target: Array<any>) { 
    target.push(...source); 
    source.splice(0, source.length); 
    //or 
    [].push.apply(target,source); 
    source.splice(0, source.length); 
} 
+0

Vui lòng thêm một số giải thích cho câu trả lời. – Sampada

0

Với ES6, bạn có thể sử dụng toán tử spread. Nó làm cho nó ngắn gọn hơn và dễ đọc hơn.

var a1 = ['a', 'e', 'f']; 
 
var a2 = ['b', 'c', 'd']; 
 

 
a1.splice(1, 0, ...a2); 
 
console.log(a1)

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