2016-06-15 9 views
-3

ich eine Liste der Schiffe gemacht haben, dass es wie so dargestellt:JavaScript-Filter-Array-Funktion

var fleet = 
    ["RMS MARY", 2000, 15], 
    ["TITANIC 2", 10000, 13], 
    ["Boaty McBoatface", 2000, 18], 
    ["Jutlandia", 1945, 10], 
    ["Hjejlen", 250, 8] 
]; 

Ich möchte eine Funktion schreiben, die die Schiffe von einer bestimmten Kapazität filtert. Beispiel:

filterByCapacity(fleet,5000) 

Dies sollte nur das Schiff zurückkehrt Titanic 2, da es das einzige Schiff mit einer Kapazität von mehr als 5000 ist. Irgendwelche Ideen, wie man eine solche Funktion schreibt?

+3

Sogar Ihr "Flotten" -Array ist falsch aufgebaut. – choz

Antwort

0

Stellen Sie Ihre Schiffe als Objekte:

var fleet = [ 
    {name: "RMS Mary", capacity: 2000, whatever: 15}, 
    ... 
]; 

Dann Sie Filter in einer Weise, die lesbar verwenden können und sinnvoll ist.

function filterByCapacity(fleetArr, minCapacity) { 
    return fleetArr.filter(function(ship) { 
    return ship.capacity > minCapacity; 
    }); 
} 
console.log(filterByCapacity(fleet, 5000)) // only Titanic 
1

Ganz einfach:

function filterByCapacity(fleet, capacity) { 
    var filteredArray = []; 
    for (var i = 0; i < fleet.length; i++) { 
     // Supposing we know that the capacity is the second index in the array 
     if (fleet[i][1] >= capacity) // Or you can make this strictly greather than (>) 
      filteredArray.push(fleet[i]); 
    } 
    return (filteredArray); 
} 

Aber ich schlage vor, Sie Objekte verwenden, anstatt Arrays. Etwas mehr wie folgt aus:

var fleet = [ 
    { 
     name: "RMS MARY", 
     capacity: 2000, 
     age: 15, // I had no idea what the third index meant so I made up one 
    }, 
    { 
     name: "TITANIC 2", 
     capacity: 10000, 
     age: 13, 
    }, 
    { 
     name: "Boaty McBoatface", 
     capacity: 2000, 
     age: 18, 
    }, 
    { 
     name: "Jutlandia", 
     capacity: 1945, 
     age: 10, 
    }, 
    { 
     name: "Hjejlen", 
     capacity: 250, 
     age: 8, 
    } 
]; 

diese Weise können Sie eine generische Funktion machen können filterBy(fleet, paramName, paramValue), dass Sie die Schiffe zurückkehren konnten, die dem Filter entsprechen

+0

"Funktion filterByCapacity (Flotte, Kapazität) { var filteredArray = []; für (var i = 0; i = Kapazität) // Oder Sie können dies streng machen greather als (>) filteredArray.push (Flotte [i]);} return (filteredArray); }“ Dieser Code funktioniert perfekt, danke! –

+0

@ MathiasV.Jensen Es ist jedoch nicht die effizienteste Lösung. Die Verwendung von 'Array.prototype.filter' (wie in @ojator und meinen Antworten) ist wesentlich schneller als das manuelle Looping. – Tobsta

+0

@Tobsta: Falsch! Was Array.prototype.filter tatsächlich tut, ist eine Schleife durch das Array mit dem zusätzlichen Aufwand, den Index und das gesamte Array für jede Iteration zu referenzieren, auch wenn Sie in Ihrem Fall die Argumente nicht benennen. Beachten Sie Folgendes: Nicht weil eine Funktion bereits existiert, ist sie notwendigerweise besser optimiert. Beweis: https://embed.plnkr.co/2nuxwkEUsiWZsvuLk6Nw/ –

1

Zunächst möchte ich darauf hinweisen, dass Ihr Array schlecht gemacht wurde . Sie haben eine linke eckige Klammer auf den ersten Eintrag fehlt („RMS MARY“.) Die korrigierte Array ist unter:

var fleet = [ 
    ["RMS MARY", 2000, 15], 
    ["TITANIC 2", 10000, 13], 
    ["Boaty McBoatface", 2000, 18], 
    ["Jutlandia", 1945, 10], 
    ["Hjejlen", 250, 8], 
]; 

Zweitens würde ich empfehlen, dass Sie die Schiffe mit Objekten anstelle von Arrays darstellen, so dass Sie Würd etwas wie diese:

var fleet = { 
    {name: "RMS MARY", capacity: 2000, somethingElse: 15}, 
    {name: "TITANIC 2", capacity: 10000, somethingElse: 13}, 
    {name: "Boaty McBoatface", capacity: 2000, somethingElse: 18}, 
    {name: "Jutlandia", capacity: 1945, somethingElse: 10}, 
    {name: "Hjejlen", capacity: 250, somethingElse: 8}, 
}; 

Nun, wie für die gewünschte Funktion, ich zwei bieten werden, eine für die Original-Array-Darstellung von Schiffen, und einen für die Objektdarstellung:

//array representation 
function filterByCapacity(fleet, capacity){ 
    return fleet.filter(function(ship){ 
     return ship[1] >= capacity; 
    }); 
} 

//object representation 
function filterByCapacity(fleet, capacity){ 
    return fleet.filter(function(ship){ 
     return ship.capacity >= capacity; 
    }); 
} 

Hoffe das hilft.