Skip to content

Functional Pattern Cleaning Filtering

ralfz123 edited this page Jan 27, 2021 · 2 revisions

Inhoud


Survey Data

Ik vind het vrij moeilijk om al gelijk aan de slag te gaan met het importeren van de Survey data van DV-2, omdat het een hele tijd geleden is dat ik heb gewerkt met JSON bestanden. Na veel onderzoek op internet gedaan te hebben en nagevraagd te hebben bij mijn medestudenten, ben ik er gelukkig wel uitgekomen.

Op deze pagina vind je:

Een nieuw array maken (3 methodes)

Ik ben na het college van Laurens op 21/10/2020 zelf aan de slag gegaan met het opschonen van de data.

Er zijn 3 methodes om een nieuw array te maken:

Methode 1 - Handmatige map

Manier 1 is de 'handmatige map'. Dat is eigenlijk veel code die elke stap duidelijk langsgaat. Dit is vrij toegankelijk voor een beginner, omdat je dan zo stapsgewijs de code schrijft.

let kolomNaam = "grootteSlaapkamer" // create a column name that is equal to the question in the survey
let lijstAntwoorden = getAnswersForQuestion(myData, kolomNaam)  // Hoisted invoked function with 2 parameters - myData refers to survey data

function getAnswersForQuestion(answers, question) { 
   let answersForQuestion=[]
   for (answer of answers){ // loop for each of the values of the column name
        answersForQuestion.push(answer[question])
        }
   return answersForQuestion //aray from answers for a specific question
}

Methode 2 - map()

Naarmate je meer code-bekwaam bent, kan je de manier 2 toepassen. Dit is de map methode. Deze code is een stuk eenvoudiger te schrijven en functioneert eigenlijk hetzelfde als manier 1.

let kolomNaam = "grootteSlaapkamer" 
let lijstAntwoorden = getAnswersForQuestion(myData, kolomNaam)  

function getAnswersForQuestion(answers, question) { 
    return answers.map(answer => answer[question]) 
}
console.log("Grootte van de slaapkamer is:", lijstAntwoorden);

Output:

Ik zat heel lang te twijfelen welke manier ik nou moest kiezen, maar ik ben toch voor de laatste (map) gegaan, omdat ik dat makkelijker schrijven vond omdat het veel minder code is. Overigens is het voor mij als developer als lezer duidelijker te lezen.

Methode 3 - map() zonder function()

Een derde manier om map te gebruiken is om het zonder functie te schrijven. Dan kan je een variabele aanmaken en daarin map gebruiken. Dit heeft precies dezelfde uitkomst als wanneer je map in een functie gebruikt. Vervolgens console.log je deze variabele en komt de data in de console in je browser terecht:

let kolomNaam = "grootteSlaapkamer" // create a column name that is equal to the question in the survey

const uniqueAnswers = myData.map(answer => answer[kolomNaam])

console.log("Unique answers are:", uniqueAnswers)

Proces

Ik snap nu veel beter hoe map() werkt en hoe je het kunt toepassen en in welke context. Ik zou dit heel goed kunnen gebruiken bij de dataset die bij mijn eigen concept horen.

Complex Cleaning Patroon

Ik heb een complex cleaning patroon geschreven die de waardes van de kolom naamAnderGeslacht opschoont. Het gaat hier om namen.

Alle code-stappen zijn in script.js (functional-programming repository) te vinden.

Stap 1 - Een nieuw array maken

Om een kolom van een dataset op te schonen, heb ik een array nodig met de waardes van die kolom erin. Dat doe ik met de map() methode.

Code
let anderGeslachtNaam = 'naamAnderGeslacht';
let allNames = myData.map((name) => name[anderGeslachtNaam]); // Makes new Array of all names
console.log('(1) Namenlijst', allNames); // List of ALL names
Output

Stap 2A - Incorrecte namen vervangen met null

Er zijn naast correct ingevoerde antwoorden (voornamen) ook antwoorden zoals " ", "-", "/", "nvt" etc. Hoewel dit incorrecte antwoorden zijn, wil ik ze alsnog in de dataset laten staan, omdat het wel een antwoord is. Daarom vervang ik dit antwoord met null.

Code
let checkedNames = allNames.map((name) => {
  if (
    name == '-' ||
    name == '/' ||
    name == '' ||
    name == 'geen' ||
    name == 'nvt' ||
    name.indexOf(' ') > 0
  ) {
    return null;
  }
  return name;
});
console.log('(2A) Gecorrigeerde namenlijst', checkedNames); // List of ALL names, with 'null' mentioning
Output

Stap 2B - Incorrecte namen eruit filteren | filter()

Ik kan er ook voor kiezen om deze incorrecte antwoorden eruit te filteren. Dat doe ik met behulp van filter(). Dit kun je doen op het moment dat je echt alleen de voornamen nodig hebt.

Code
// Filters out a list of incorrect answers
let filteredNames = allNames.filter((name) => {
  return (
    name != '-' &&
    name != '/' &&
    name != '' &&
    name != 'geen' &&
    name != 'nvt' &&
    name.indexOf(' ') < 1 // https://stackoverflow.com/q/17616624 - Checks if there are 1 or more whitespaces
  );
});
console.log('(2B) Namenlijst gefilterd (zonder incorrecte antwoorden)', filteredNames); // List of FILTERED names
Output

Stap 3 - Eerste letter vervangen door een hoofdletter

Namen horen altijd geschreven te worden met als eerste letter een hoofdletter. Voor dit principe heb ik een herbruikbare functie geschreven die hiervoor zorgt.

Code
let capitalizeNames = checkedNames.map(function (name) {
	return name != null ? name.charAt(0).toUpperCase() + name.slice(1) : name;
})

console.log('(3) Namenlijst met hoofdletter', capitalizeNames) // List of ALL names, with uppercased first letter
Output

De lijst hierboven geeft een duidelijke, mooie en schone weergave van de namenlijst βœ…

RDW data

Dataset filteren

Bij de data die ik gebruikte voor mijn eigen concept, was het nodig dat het werd gefilterd. Dit versta ik onder cleaning van data, want ik haal de overige datavariabelen weg en ik maak een nieuw array aan met de data die ik nodig heb. Hiervoor heb ik .map() gebruikt, omdat ik dat de mooiste en meest begrijpbare manier vond. Er zullen vast ook andere methoden zijn om dit mooier en misschien wel beter te doen, maar dit is een methode die past bij mijn niveau.

Dataset vΓ²Γ²r het filteren

{
 point: {
    lat: 52.21061864,
    lng: 5.17506312
 },
 id: "28008b58-5a03-11ea-8ed4-42010a840fd0",
 status: {
    available: "2",
    charging: "0"
 },
 power: 11040,
 publicaccess: "Public"
}
Code
function filteredDataset(dataDay) {
	const cleanDataDay = dataDay.data.map((element) => {
		const object = {};
		object.point = element.point;
		object.status = element.status;

		return object;
	});

Dataset na het filteren

{
 point: {
    lat: 52.21061864,
    lng: 5.17506312
},
 status: {
    available: "2",
    charging: "0"
}
Clone this wiki locally