Ich möchte, dass die Funktion alle dreistelligen Ganzzahlen an die Vorderseite des Arrays zurückgibt. Wenn ich dies auf der Konsole protokolliere, erhalte ich 8 Arrays, von denen keines die gesuchte Ausgabe ist. Ich vermute, der Fehler beginnt, wenn ich for () verwende.

Außerdem sind alle Tipps zur weiteren Bereinigung des Codes willkommen, da ich im Laufe der Zeit Best Practices lerne.

    let numList = [1, 324,34, 3434, 304, 2929, 23, 444]
    			
    function checkLength (num){
    	num.forEach(function (n){ 
    		var stringLength = n.toString().length; //n = 324, 204, 444 
    		for (i=0; i<num.length; i++){
    			if (stringLength == 3){ 
    			let a = num.splice (i,1);
    			num.unshift (a[0]); 
    			} 
    		}   	
    	})
      console.log(num);
   	}
    
    checkLength(numList);
1
Chi Lee 17 Apr. 2018 im 23:04

6 Antworten

Beste Antwort

Bitte schauen Sie sich den Code an. Ich hoffe, dass es für Sie selbsterklärend ist. Grundsätzlich haben Sie hier zwei Möglichkeiten:

  1. Mutieren Sie das ursprüngliche Array.
  2. Erstellen Sie ein neues Array aus der Funktion und geben Sie es zurück.

Ich verwende den ersten Ansatz in diesem Code unten:

function shiftThreeDigitValuesInFrontOfArray(array)
{
    var threeDigitValue; // Will hold the value later,

    array.forEach(function(element, index)
    {
        // We are only interested in 3 digit values
    
        if(element.toString().length === 3)
        {
            // Remove the value from the array
            threeDigitValue = array.splice(index, 1);
            
            // And put it in front of the array
            array.unshift(threeDigitValue[0]);
            
        }
    });
}

var array = [1, 324,34, 3434, 304, 2929, 23, 444];

// Let the magic begin!
shiftThreeDigitValuesInFrontOfArray(array);

// View the results
console.log(array);

Bitte lassen Sie mich wissen, ob dies für Sie funktioniert :)

0
Zahid Saeed 17 Apr. 2018 im 20:16

Anstatt die Zahl in eine Zeichenfolge umzuwandeln, können Sie einfach den Bereich überprüfen. Sobald eine dreistellige Nummer gefunden wurde, entfernen wir sie mit splice() aus dem Array und fügen sie mit .unshift() vor dem Array hinzu.

let numList = [1, 324, 34, 3434, 304, 2929, 23, 444];

function checkLength(num) {
  num.forEach((v, i, a) => {
    if(v > 99 && v < 1000) {
      a.unshift(...a.splice(i, 1));
    }
  });
    
  return num;
}

console.log(checkLength(numList));
0
Mohammad Usman 17 Apr. 2018 im 20:26

Reduzieren Sie das Array in ein Array aus 3 Ziffern und einem Array der übrigen, und reduzieren Sie sie dann auf ein einzelnes Array, indem Sie sie in Array.concat():

function checkLength(array) {
  return [].concat(...array.reduce((r, n) => {   
    r[n > 99 && n < 1000 ? 0 : 1].push(n);
    
    return r;
  }, [[], []]));
}

console.log(checkLength([1, 324, 34, 3434, 304, 2929, 23, 444]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Ori Drori 17 Apr. 2018 im 20:20

Warum verwenden Sie eine verschachtelte Schleife?

Du kannst es so machen:

var arr = [1, 324,34, 3434, 304, 2929, 23, 444];

function checkLength (arr){
    arr.forEach(function (n, index){ 
        if (n >= 100 && n < 1000) { 
            arr.unshift(arr.splice(index, 1)[0]);
        }
    });
    return arr;
}

checkLength(arr);

Bitte beachten Sie, dass das Ändern eines Arrays, über das Sie eine Schleife ausführen, gefährlich sein kann und zu etwas führen kann, das Sie nicht erwarten würden.

0
Liviath 17 Apr. 2018 im 20:16

Ich denke, Sie sind verwirrt darüber, wie Shift funktioniert ...

Die Methode shift () entfernt das erste Element aus einem Array und gibt das entfernte Element zurück

Es werden nicht alle dreistelligen Ganzzahlen nach vorne gebracht. Es wird nur das erste Element aus dem Array entfernt, und das wird zurückgegeben.

Ich denke, Sie möchten das Array entweder sortieren oder filtern.

Wenn Sie das Array nach der Länge seines Werts sortieren möchten, gehen Sie folgendermaßen vor: .sort(a=>a.toString().length!=3?1:-1)

let numList = [1, 324,34, 3434, 304, 2929, 23, 444]

console.log(numList.sort(a=>a.toString().length!=3?1:-1))

Wenn Sie Filtern möchten, ist dies fast dasselbe:

let numList = [1, 324,34, 3434, 304, 2929, 23, 444]

console.log(numList.filter(a=>a.toString().length==3?1:0))
0
Luis felipe De jesus Munoz 17 Apr. 2018 im 20:10

Grundsätzlich benötigen Sie einen Index der ersten Elemente der Länge mit drei und einen weiteren Index zum Iterieren des Arrays.

Wenn ein Element die Zeichenfolgenlänge von drei hat, verbinden Sie dieses Element und setzen Sie es wieder in den gespeicherten Index. Erhöhen Sie dann diesen Index.

Fahren Sie mit der Schleife fort.

Dieser Vorschlag behält die Reihenfolge der Artikel bei. Es bewegt nur die Elemente mit einer Stringlänge bis zu, während auch die Reihenfolge dieser Elemente beibehalten wird.

function checkLength(array) {
    var i = 0,
        j;

    for (j = 0; j < array.length; j++) {
        if (array[j].toString().length === 3) {
            array.splice(i++, 0, array.splice(j, 1)[0]);
        }
    }
    return array;
}

console.log(checkLength([1, 324, 34, 3434, 304, 2929, 23, 444]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Nina Scholz 17 Apr. 2018 im 20:12