2016-04-10 7 views
-6

Es gibt zwei Arrays:JS beitreten Arrays mit Ersatz

var arr1 = ["a", "b", "c"]; 
var arr2 = ["k",  ,"l","m","n"]; 

einige standart Funktion benötigen, die zurückgibt:

var arr3=["k","b","l"]; 

Dieser ist zu langsam:

function join_arrays(arr1,arr2) 
{ 
var arr3=[]; 
for(var i=0;i<arr1.length;i++) 
    if(arr2[i]==undefined) 
     arr3[i]=arr1[i]; 
    else 
     arr3[i]=arr2[i]; 
return arr3; 
} 
+3

Wie können Sie feststellen, dass es zu langsam ist? –

+0

Ich brauche nur etwas schneller. Hat Tonnen von Arrays. –

+0

Wenn Sie Ihren Code schneller machen wollen, dann fügen Sie die Operation 'arr1.length' nicht zuerst in den 'i Redu

Antwort

0

Sie könnten tun die folgenden:

var arr1 = ["a", "b", "c"]; 
var arr2 = ["k",undefined,"l","m","n"]; 
var arr3 = []; 


function join_arrays(arr1,arr2){ 
arr3 = arr2; 
var i = arr3.indexOf(undefined); 
while(i !=- 1){ 
    arr3[i] = arr1[i]; 
    i = arr3.indexOf(undefined); 
    } 
return arr3; 
} 

Allerdings gibt es hier eine kleine Einschränkung, soweit meine Tests in JSBin mir gezeigt haben, dass Sie die leeren Werte, die ersetzt werden sollen, explizit auf undefined gesetzt haben, wie in meinem Beispiel. Wenn das für dich nicht optimal ist, könnte es einen besseren Weg geben als den, den ich hier gezeigt habe.

Hoffentlich läuft dies schneller als Ihr Code, da es nur so oft durchlaufen wird, wie für die Ersetzungen erforderlich ist und arr3 sofort mit arr2 füllen wird.

UPDATE:

Beachten Sie, dass, während die obige Funktion ist, ist es nicht sicher ist, weil, wenn das zweite Array leere Elemente in einem Index hat, die nicht in dem ersten ist, es wird eine verursachen Error. Daher könnten Sie so etwas tun:

function join_arrays(arr1,arr2){ 
arr3=arr2; 
var i = arr3.indexOf(undefined); 
while(i!=-1 && i<arr1.length){ 
    arr3[i]=arr1[i]; 
    i=arr3.indexOf(undefined); 
    } 
return arr3; 
} 

Also für var arr2 = ["k",undefined,undefined,"l","m","n",undefined] Ergebnis wird ["k", "b", "c", "l", "m", "n", undefined] mit dieser Methode, statt einen Fehler oder eine Endlosschleife bekommen!

0

Mit Standardfunktionen kann es schneller sein.

let arr1 = ["a", "b", "c"]; 
let arr2 = ["k",  ,"l","m","n"]; 
arr1.map((e,i)=>arr2[i]==undefined?e:arr2[i]) 
0

Wahrscheinlich sollte dieser einzelne Liner Ihre Arbeit machen.

var arr3 = arr1.forEach((e,i) => arr2[i] === void 0 ? arr3.push(e): arr3.push(arr2[i]));