2017-02-10 4 views
-3

Ich mache this Herausforderung auf codewars lesen, es bestanden alle den Test, aber ich habe einen Fehler:Kann nicht Eigenschaft ‚Länge‘ von null in JavaScript

TypeError: Cannot read property 'length' of null

so kann ich nicht über die Herausforderung. Kann mir jemand sagen, was mit diesem Code nicht stimmt?

function averages(numbers) { 
    for(var i=0; i<numbers.length; i++){ 
    if(numbers.length < 2 || numbers[i] === ""){ 
     return []; 
    } else { 
     numbers[i] = (numbers[i] + numbers[i+1])/2; 
    } 
    } 
    numbers.pop(); 
    return numbers 
} 
+0

gut, was erwarten Sie 'length' zu sein, wenn' null' als Parameter übergeben wird? – UnholySheep

+0

Sie übergeben Zahlen an Ihre Funktion, die ein Array sein sollte, wenn nicht, wird es diesen Fehler zeigen. Seien Sie also vorsichtig, wenn Sie immer ein Array übergeben, auch wenn es nur eine Nummer ist. – LordNeo

Antwort

3

Es ist ein wichtiger Teil der Anweisungen, die Sie nicht Handhabung:

If the array has 0 or 1 values or is null or None, your method should return an empty array.

function averages(numbers) { 
    if (!numbers) return []; // return empty array 

    for(var i=0; i<numbers.length; i++){ 
    if(numbers.length < 2 || numbers[i] === ""){ 
     return []; 
    } else { 
     numbers[i] = (numbers[i] + numbers[i+1])/2; 
    } 
    } 
    numbers.pop(); 
    return numbers 
} 
+0

gelöst, danke – Mike

+0

Es gibt eine eingebaute Methode 'Array.isArray', die verwendet werden sollte; Diese Methode wird immer noch einen Fehler werfen, wenn ich sie mit' {a : 2} '. Das Hinzufügen von -1 zum Loop-Iterator führt auch zu einem NaN-Ergebnis (keine Zahl) in der letzten Zahl (dadurch wird die Pop-Out-Angabe nicht obligatorisch, sondern ein schlechtes Verhalten). Sieh auf meine Antwort hin, ich habe es dort erklärt – Mijago

0
function averages(numbers) { 
    if(numbers) 
    { 
    for(var i=0; i<numbers.length; i++){ 
     if(numbers.length < 2 || numbers[i] === ""){ 
     return []; 
     } else { 
     numbers[i] = (numbers[i] + numbers[i+1])/2; 
     } 
    } 
    numbers.pop(); 
    return numbers 
    } 
    else 
    { 
    return []; 
    } 

} 

Fügen Sie einfach eine Null-Prüfnummer Variable ur. Dann bist du gut zu gehen.

1

Sie müssen nur testen, ob der Parameter null ist

//test if numbers is null 
    if(numbers == null){ 
    return []; 
    } 
    for(var i=0; i<numbers.length; i++){ 
    if(numbers.length < 2 || numbers[i] === ""){ 
     return []; 
    } else { 
     numbers[i] = (numbers[i] + numbers[i+1])/2; 
    } 
    } 
    numbers.pop(); 
    return numbers 
+0

Besser: 'if (Array.isArray (numbers) {' – Mijago

0

Code zu korrigieren :

function averages(numbers) { 
    if (!Array.isArray(numbers)) { 
    return []; 
    } 
    for(var i=0; i<numbers.length; i++){ 
    if(numbers.length < 2){ 
     return []; 
    } else { 
     numbers[i] = (numbers[i] + numbers[i+1])/2; 
    } 
    } 
    numbers.pop(); 
    return numbers 
} 

Ich verwende Array.isArray, um zu überprüfen, ob es wirklich ein Array ist. Es ist eine integrierte Funktion, also sollten Sie sie verwenden.

Sie können in einem Schritt dieses und die Länge überprüfen, mehr Schritte speichern (sehen Sie das Beispiel unten).

Um eine sauberere Lösung zu bieten:

function averages(numbers) { 
    if (!Array.isArray(numbers) || numbers.length < 2) { 
    return []; 
    } 
    for(var i = 0; i < numbers.length - 1; i++){ 
     numbers[i] = (numbers[i] + numbers[i + 1])/2; 
    } 
    numbers.pop(); 
    return numbers 
} 

Es funktioniert gut, habe ich auch noch eine "-1" auf der Schleife, als die letzte Zahl wird "NaN" werden (Not a Number), weil es ist kein Element danach und (10 + undefined)/2 => NaN/2 => NaN. Dies fügt Ihrem Algorithmus auch einen unnötigen Schritt hinzu.

Um es

Eine andere Lösung Array vervollständigen machen könnte sein: Karte:

function averages(numbers) { 
    if (!Array.isArray(numbers) || numbers.length < 2) { 
    return []; 
    } 
    numbers.map(function(val, idx, arr) { 
    arr[idx] = (val + arr[idx+1])/2; 
    }); 
    numbers.pop(); 
    return numbers; 
} 
Verwandte Themen