Porównaj ceny domen i usług IT, sprzedawców z całego świata

Najlepszy sposób na połączenie tablicy z tablicą w javascript


Czy istnieje lepszy sposób niż ten, aby połączyć tablicę z inną tablicą w javascript
var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");';
eval(string);

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć

apply
https://developer.mozilla.org/ ... apply
aby uniknąć eval:
var args = [start, number].concat(newItemsArray);
Array.prototype.splice.apply(theArray, args);

Funkcjonować

apply
https://developer.mozilla.org/ ... apply
służy do wywoływania innej funkcji z podanym kontekstem i argumentami, na przykład jako tablica:
Jeśli zadzwonimy:
var nums = [1,2,3,4];
Math.min.apply(Math, nums);

Zastosuj funkcję:
Math.min(1,2,3,4);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


AKTUALIZACJA: wersja ES6

Jeśli piszesz w ES6, możesz użyć "operatora rozszerzania" (...)
array.splice(index, 0, ...arrayToInsert);

Aby uzyskać więcej informacji na temat operatora rozprzestrzeniania, zobacz

dokumentacja Mozilli
https://developer.mozilla.org/ ... yntax
.

W „starym” po stronie ES5

Jeśli zawiniesz powyższą odpowiedź w funkcję, otrzymasz to:
function insertArrayAt(array, index, arrayToInsert) {
Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
}

Używałbyś tego w ten sposób:
var arr = ["A", "B", "C"];
insertArrayAt(arr, 1, ["x", "y", "z"]);
alert(JSON.stringify(arr));// output: A, x, y, z, B, C

Możesz to sprawdzić w tym jsFiddle:

http://jsfiddle.net/luisperezphd/Wc8aS
http://jsfiddle.net/luisperezphd/Wc8aS/
/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To pytanie jest naprawdę stare, ale od wersji ES6 jest łatwiejszy sposób, aby to zrobić za pomocą operatora spreadu:
sourceArray.splice(index, 0, ...insertedArray)

Jeśli używasz nieskompilowanego javascript w swojej przeglądarce, sprawdź, czy jest on obsługiwany w Twojej docelowej przeglądarce pod adresem

https://kangax.github.io/compa ... read_(...)_operator
https://kangax.github.io/compa ... read_(...)_operator
.
Ponadto może to być trochę nie na temat, ale jeśli nie chcesz lub nie chcesz modyfikować oryginalnej tablicy, ale możesz zamiast tego użyć nowej tablicy, rozważ następujące podejście:
mergedArray = sourceArray.slice(0, index).concat(insertedArray, sourceArray.slice(index))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz również dodać taką funkcję do prototypu tablicy, jeśli potrzebujesz czegoś, co jest prawie identyczne z metodą splice. Na przykład.
Array.prototype.spliceArray = function(index, n, array) {
return Array.prototype.splice.apply(this, [index, n].concat(array));
}

Wtedy użycie byłoby proste:
var array = ["A","B","C","","E","F"];array.splice(3,1,"D");
// array is ["A","B","C","D","E","F"]array.spliceArray(3,3,["1","2","3"]);
// array is ["A","B","C","1","2","3"]

Zobacz to w akcji tutaj:

http://jsfiddle.net/TheMadDeveloper/knv2f8bb/1
http://jsfiddle.net/TheMadDeveloper/knv2f8bb/1/
/
Kilka uwag:
  • Funkcja
    splice
    bezpośrednio modyfikuje tablicę, ale zwraca tablicę elementów, które zostały usunięte ... nie tablicę podzieloną.
  • Chociaż generalnie nie jest zalecane rozszerzanie podstawowych klas javascript, jest to stosunkowo nieszkodliwe dla większości standardowych frameworków.
  • Rozszerzenie macierzy nie będzie działać w przypadkach, w których stosowane są wyspecjalizowane tablice, takie jak dane IMAGEDATA UINT8CLAMPEDARRAY.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Powyższe odpowiedzi, które obejmują splice.apply i włóż tablicę do jednej wkładki, spowodują przepełnienie stosu w przypadku dużej tablicy.
Zobacz przykład tutaj:

http://jsfiddle.net/gkohen/u49ku99q/
http://jsfiddle.net/gkohen/u49ku99q/
być może będziesz musiał wyciąć i popchnąć każdy element wstawionego i resztę oryginalnej tablicy, aby działał.
Zobacz skrzypce:

http://jsfiddle.net/gkohen/g9abppgy/26
http://jsfiddle.net/gkohen/g9abppgy/26/
/
Array.prototype.spliceArray = function(index, insertedArray) {
var postArray = this.splice(index);
inPlacePush(this, insertedArray);
inPlacePush(this, postArray); function inPlacePush(targetArray, pushedArray) {
// Not using forEach for browser compatability
var pushedArrayLength = pushedArray.length;
for (var index = 0; index < pushedArrayLength; index++) {
targetArray.push(pushedArray[index]);
}
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest tutaj wiele sprytnych odpowiedzi, ale powodem, dla którego używasz splice jest to, że wpycha elementy do bieżącej tablicy bez tworzenia innej. Jeśli potrzebujesz utworzyć tablicę dla
concat ()
, aby móc użyć
apply ()
, to tworzysz 2 dodatkowe tablice śmieci! W pewnym sensie niszczy cały cel pisania ezoterycznego Javascript. Ponadto, jeśli nie przejmujesz się zużyciem pamięci (a powinieneś) po prostu
dest = src1.concat (src2)
; jest nieskończenie bardziej czytelny. Oto moja najmniejsza liczba wierszy przy zachowaniu skutecznej odpowiedzi.
for( let item of src ) dest.push( item );

Lub jeśli chcesz go wypełnić i odzyskać nieco lepszą obsługę przeglądarki:
src.forEach( function( x ) { dest.push(x); });

Jestem pewien, że ta pierwsza jest bardziej wydajna (to jest słowo;), ale nie jest obsługiwana we wszystkich przeglądarkach na wolności.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli nie chcesz wiązać wstawiania elementów z pierwszymi dwoma parametrami
Array.splice()
https://developer.mozilla.org/ ... plice
,
elegancki sposób to użycie
Function.bind()
https://developer.mozilla.org/ ... /bind
i
Function.apply()
https://developer.mozilla.org/ ... apply
razem.
theArray.splice.bind(null, startIndex, deleteCount).apply(newItemsArray);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Chciałem mieć funkcję, która zajmowałaby tylko część oryginalnej tablicy, więc mam nieco inną
oparte na funkcji

na odpowiedź
https://stackoverflow.com/a/1348196/1462615
CMS
function spliceArray(array, index, howmany, source, start, end) {
var arguments;
if( source !== undefined ){
arguments = source.slice(start, end);
arguments.splice(0,0, index, howmany);
} else{
arguments = [index, howmany];
}
return Array.prototype.splice.apply(array, arguments)
}Array.prototype.spliceArray = function(index, howmany, source, start, end) {
return spliceArray(this, index, howmany, source, start, end);
}

Możesz to zobaczyć pod adresem:

https://jsfiddle.net/matthewvukomanovic/nx858uz5
https://jsfiddle.net/matthewvukomanovic/nx858uz5/
/

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się