Есть ли способ использовать Array.splice в javascript с третьим параметром в виде массива?
Я пытаюсь сделать следующее:
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]
Я ограничен в моем случае использования, если a2 существует как массив неопределенного размера. Кто-нибудь знает способ подачи сплайсинга массива в качестве замены или, альтернативно, встроенную функцию для этого? Я знаю, что могу перебирать элементы a2 и объединять их по одному, но я предпочел бы самый быстрый способ, потому что мне нужно будет сделать это много.
Ответы
Ответ 1
Array.splice
поддерживает несколько аргументов после первых двух. Все аргументы будут добавлены в массив. Зная это, вы можете использовать Function.apply
для передачи массива в виде списка аргументов.
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));
Ответ 2
С ES6 вы можете использовать оператор spread. Это делает его более понятным и понятным.
var a1 = ['a', 'e', 'f'];
var a2 = ['b', 'c', 'd'];
a1.splice(1, 0, ...a2);
console.log(a1)
Ответ 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"]
Ответ 4
Это должно сделать трюк.
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]
Ответ 5
Попробуйте следующее:
var params = a2.slice(0);
params.unshift(1,0);
a1.splice.apply(a1,params);
В более общем случае:
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);
Ответ 6
Array.prototype.splice.apply( [1,2,3], [2, 0].concat([4,5,6]) );
Ответ 7
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);
}