2016-05-27 7 views
0

Ich versuche eine Funktion in JavaScript zu erstellen, die die Indizes eines Arrays neu anordnet. Ich kam auf die folgende Idee, aber mit dieser Methode muss ich eine neue else if-Klausel für jede mögliche Länge des Arrays als viertes Argument für die Methode reformatArray gegeben. Können Parameter in einer Methode intuitiver hinzugefügt werden?Eine intuitivere Möglichkeit zum Umordnen des Arrays

Code:

function start() { 
    var array1 = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8"]; 

    reformatArray(array1, 1, 2, [1, 2, 0]); 
    //output should be ["Item 1", "Item 3", "Item 4", "Item 2", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8"] 
    //WORKS 

    var array2 = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8"]; 

    reformatArray(array2, 2, 5, [3, 1, 3, 2]); 
    //output should be ["Item 1", "Item 2", "Item 6", "Item 4", "Item 6", "Item 5", "Item 8"] 
    //DOES NOT WORK because array as fourth argument is greater than 3 in length 
} 

function reformatArray(array, startIndex, numOfIndicesToReplace, newIndicesPositions) { 
    var newPosLength = newIndicesPositions.length; 

    if (newPosLength == 0) { 
     array.splice(startIndex, numOfIndicesToReplace); 
    } else if (newPosLength == 1) { 
     array.splice(startIndex, numOfIndicesToReplace, array[startIndex + newIndicesPositions[0]]); 
    } else if (newPosLength == 2) { 
     array.splice(startIndex, numOfIndicesToReplace, array[startIndex + newIndicesPositions[0]], array[startIndex + newIndicesPositions[1]]); 
    } else if (newPosLength == 3) { 
     array.splice(startIndex, numOfIndicesToReplace, array[startIndex + newIndicesPositions[0]], array[startIndex + newIndicesPositions[1]], array[startIndex + newIndicesPositions[2]]); 
    } 
    //etc. 
} 

Vielen Dank im Voraus.

+1

Was genau wollen verketten erreichen? –

+0

Alle Werte im Array 'newIndicesPositions' werden als einzelne Parameter in der 'splice'-Methode hinzugefügt. –

+0

In der Funktion 'reformatArray' habe ich einen Kommentar' // etc' hinzugefügt, was ich damit meine, dass mehr wenn else-Klauseln hinzugefügt werden sollten, die die Länge von newIndicesPositions überprüfen und Parameter entsprechend der Spleißmethode hinzufügen. –

Antwort

0

Verwenden Sie apply. Erster Parameter ist, was an this gebunden ist, und zweitens ist ein Array von Argumenten.

array.splice.apply(null, arrayOfArguments)

0

Nehmen Sie die Parameter als Objekt. Dies hilft, die Anzahl der Parameter zu erweitern.

function reformatArray(params) { 
    var array = params.array; 
    var startIndex = params.startIndex; 
    var numOfIndicesToReplace = params.numOfIndicesToReplace; 
    var newIndicesPositions = params.newIndicesPositions; 

    var newPosLength = newIndicesPositions.length; 

    if (newPosLength == 0) { 
     array.splice(startIndex, numOfIndicesToReplace); 
    } else if (newPosLength == 1) { 
    array.splice(startIndex, numOfIndicesToReplace, array[startIndex +  newIndicesPositions[0]]); 
    } else if (newPosLength == 2) { 
     array.splice(startIndex, numOfIndicesToReplace, array[startIndex + newIndicesPositions[0]], array[startIndex + newIndicesPositions[1]]); 
    } else if (newPosLength == 3) { 
     array.splice(startIndex, numOfIndicesToReplace, array[startIndex + newIndicesPositions[0]], array[startIndex + newIndicesPositions[1]], array[startIndex + newIndicesPositions[2]]); 
    } 
    //etc. 
} 

Oder Sie können das Argument objects inside-Methode verwenden. Argumente ist ein Schlüsselwort. arguments object ist ein Array-ähnliches Objekt, das den an eine Funktion übergebenen Argumenten entspricht. Weitere Informationen zur Argument-Syntax finden Sie auf der MDN-Website.

1

Sie können eine Liste von Parametern erstellen, die an die Spleißstelle übergeben werden sollen, und Function.prototype.apply verwenden, um sie an die Spleißstelle zu übergeben.

function reformatArray(array, startIndex, numOfIndicesToReplace, newIndicesPositions) { 
    var newPosLength = newIndicesPositions.length; 
    var params = [startIndex, numOfIndicesToReplace]; 

    newIndicesPositions.forEach(function(val, pos) { 
    params.push(array[startIndex + newIndicesPositions[pos]]) 
    }); 

    array.splice.apply(array, params); 
} 
0

Hier ist eine andere Art und Weise Sie es durch Spleißen in dem Array tun könnte selbst und dann die Arrays

function reformatArray2(array, startIndex, numOfIndicesToReplace, newIndicesPositions) {   
    var replaceValues = newIndicesPositions.map(function(index) { 
     return array[startIndex + index]; 
    }) 

    array.splice(startIndex, numOfIndicesToReplace, replaceValues); 
    return [].concat.apply([], array); 
} 

Plunker Demo

(Array Abflachung Technik found here)