2016-06-25 2 views
1
var people = new Array(); 
function People (name, location, age){ 
    this.name = name; 
    this.location = location; 
    this.age = age; 
} 

Ich habe zwei andere Funktionen, um die Leute zu generieren und sie in eine Tabelle zu laden.Was bedeutet es, dass "JavaScript-Objekte durch Strings indiziert werden können"?

function generatePeople(){} 
function loadPeopleIntoTable(){} 

Ich brauche im Grunde durch die Liste der Leute zu gehen, ihre Namen und zeigen dann die häufigsten Vornamen, die in dieser Tabelle erscheinen. Diese Funktion heißt einfach commonFirstName().

function commonFirstName(){} 

Der Hinweis gegeben ist „JavaScript-Objekte, die von Strings indiziert werden kann“, aber ich verstehe nicht, dass 100%. Ich habe bereits den Code geschrieben, um das Array durchzugehen und den gemeinsamen Vornamen zu finden. Aber ich kann nicht das People-Array aufrufen, um durch diese Liste zu gehen - ich kann es nur mit einem manuell erstellten Array in commonFirstName() arbeiten. Warum das?

Ich kann bei Bedarf weitere Erläuterungen geben.


function commonFirstName(){ 
     alert(people[1]); 
     //Rest of code that does the occurrences/name here 
} 

Der Ausgang dafür ist einfach [object Object].

Auf der anderen Seite:

function commonFirstName(){ 
tempArray = ['John Smith', 'Jane Smith', 'John Black']; 
//Run through algorithm for finding common name. 
} 

Gibt einen Alarm Ausgabe von „Common Name:. John Tritt 2 mal“

ich gedacht hatte, wenn ich die Array Menschen durch die Funktion einfach weitergegeben, wie :

function commonFirstName(people){ 
alert(people[1]); 
} 

Sollte mir etwas geben, irgendetwas. Ich erwarte zu diesem Zeitpunkt nicht nur den Vornamen, sondern zumindest den vollständigen Namen, Ort und Alter von Element 1 oder eines davon. Es läuft einfach nicht, als ob das Array nicht existiert oder einfach leer ist.

Dies ist mein Code für alles, was ich habe:

var PEOPLECOUNT = 100; 
    var people = new Array(); 

    function People(name, location, age) { 
     this.name = name; 
     this.location = location; 
     this.age = age; 
    } 

    function initPage() { 
     generateTableRows(); 
     generatePeople(); 
    } 

    function generateTableRows() { 
     var table = document.getElementById("ageTable"); 
     var tableBody = table.getElementsByTagName("tbody")[0]; 

     for (var i = 0; i < PEOPLECOUNT; i++) { 
     var newRow = document.createElement("tr"); 

     newRow.setAttribute("id", "ageRow" + i.toString(10)); 

     var td1 = document.createElement("td"); 
     var td2 = document.createElement("td"); 
     var td3 = document.createElement("td"); 

     td1.setAttribute("class", "dataCell"); 
     td2.setAttribute("class", "dataCell"); 
     td3.setAttribute("class", "dataCell"); 

     newRow.appendChild(td1); 
     newRow.appendChild(td2); 
     newRow.appendChild(td3); 
     tableBody.appendChild(newRow); 
     } 
    } 

    function generatePeople() { 
     var firstNames = ["Jack", "Will", "Josh", "Tom", "Sam", "Chloe", "Emily", "Sophie", "Lily", "Olivia"]; 
     var surnames = ["Smith", "Jones", "Brown", "Taylor", "Johnson", "White"]; 
     var locationNames = ["Canyonville", "Hailsmere", "Northpath", "Gracemont", "Gainsburgh", "Heathersmith"]; 

     for (var i = 0; i < PEOPLECOUNT; i++) { 
     var name = firstNames[randInt(firstNames.length - 1)] + " " + surnames[randInt(surnames.length - 1)]; 
     var location = location[randInt(locationNames.length - 1)]; 
     var age = randInt(100); 
     var currentPeople = new People(name, location, age); 

     people.push(currentPeople); 
     } 

     loadPeopleIntoTable(); 
    } 

    function loadPeopleIntoTable() { 
     for (var i = 0; i < PEOPLECOUNT; i++) { 
     var people = people[i]; 
     var peopleRow = document.getElementById("ageRow" + i.toString(10)); 
     var cells = peopleRow.getElementsByTagName("td"); 

     for (var j = 0; j < cells.length; j++) { 
      if (cells[j].hasChildNodes()) { 
      cells[j].removeChild(cells[j].childNodes[0]); 
      } 
     } 

     cells[0].appendChild(document.createTextNode(people.name)); 
     cells[1].appendChild(document.createTextNode(people.location)); 
     cells[2].appendChild(document.createTextNode(people.age.toString(10))); 
     } 
    } 

function randInt(maxVal) { 
       return Math.floor(Math.random() * (maxVal + 1)); 
      } 

    function commonFirstName() { 

     var tempArray = []; 
     var fName; 
     var array = ['John Smith', 'Jane Smith', 'John Black']; 
     for (i = 0; i < array.length; i++) { 
     fName = array[i].split(' ').slice(0, -1).join(' '); 
     tempArray.push(fName); 
     } 

     var mostCommon; 
     var occurences = 0; 
     for (j = 0; j < tempArray.length; j++) { 
     var tempName = tempArray[j]; 
     var tempCount = 0; 
     for (k = 0; k < tempArray.length; k++) { 
      if (tempArray[k] == tempName) { 
      tempCount++; 
      } 
      if (tempCount > occurences) { 
      mostCommon = tempName; 
      occurences = tempCount; 
      } 
     } 
     } 
     alert(mostCommon + " : " + occurences); 
    } 

jetzt mit dem Array vollen Namen dies funktioniert, die in der Funktion ist aber nicht für die Reihe von Menschen, die mit Namen, Ortsobjekten von Menschen bestehen und Alter (wie zu Beginn gezeigt). Ich brauche nur dieses Array durchlaufen, damit ich die Elemente teilen kann -_-

+0

Bitte teilen Sie Ihren Code für das Durchlaufen des Arrays. –

+0

this.name === this ["name"], es ist wie eine Hash-Map in Java oder ein Wörterbuch in anderen Sprachen – chiliNUT

+0

Bitte geben Sie Code an, wo Sie die People() -Methode und people [] -Array verwenden. –

Antwort

2

"JavaScript-Objekte können von Strings indiziert werden" bedeutet, dass ein Objekt in JavaScript ist es wie eine Hash-Tabelle. Der Name der Methode/des Feldes ist nur ein String-Schlüssel in dieser Tabelle object.anyName kann als geschrieben werden.

Für Ihre Übung können Sie damit einen Zähler für die gebräuchlichsten Namen erstellen.

Da es eine Übung, ich werde Ihnen die vollständige Antwort nicht geben;) nur die Idee:

  • Für jedes Element im Array, nehmen Sie die Person Namen.
  • Verwenden Sie den Namen der Person als Schlüssel einer "Tabelle", wenn der Name bereits vorhanden ist Summe eins zum Zähler.
  • Am Ende Sie ein Paar Name/
  • Vorkommen haben werden

Wenn Sie sehr faul, um die Übung sind ... Blick auf den Quellcode lodash countBy Funktion (https://github.com/lodash/lodash/blob/4.13.1/lodash.js#L8373), tut es das, was Sie brauchen.

+1

Schade, dass sie das "Hausaufgaben" -Tag entfernt haben :-) –

+0

Hey - habe gerade meinen Kommentar hinzugefügt, den ich vorher zu meinem ursprünglichen Post gegeben habe. Aber im Grunde verstehe ich einfach nicht, wie man das Array, das außerhalb der Funktion erzeugt wird, in die Funktion bringt, damit ich es durchsortieren kann - die Codierung für die Sortierung, um das Vorkommen zu finden und das gebräuchlichste Element ist erledigt. Aber ich kann es nur tun, wenn ich ein Array, das ich in der Funktion durch den Algorithmus erstellt habe, ausführen. – Yamenstein

0

In Bezug auf Ihre bearbeiten: Leiten Sie das Array als ein Argument gut funktioniert, brauchen Sie nicht das Array innerhalb der Funktion haben:

var fullNames = ['John Smith', 'Jane Smith', 'John Black']; 

function commonFirstName(array) {     

      var tempArray = []; 
      var fName; 
      for (i=0; i < array.length; i++){ 
       fName = array[i].split(' ').slice(0, -1).join(' '); 
       tempArray.push(fName); 
      } 

      var mostCommon; 
      var occurences = 0; 
      for (j=0; j < tempArray.length; j++){ 
       var tempName = tempArray[j]; 
       var tempCount = 0; 
       for (k=0; k < tempArray.length; k++){ 
        if (tempArray[k] == tempName){ 
         tempCount++; 
        } 
        if (tempCount > occurences){ 
         mostCommon = tempName; 
         occurences = tempCount; 
        } 
       } 
      } 
      alert(mostCommon + " : " + occurences); 
     } 

commonFirstName(fullNames); 

Überprüfen Sie die Geige: https://jsfiddle.net/d2m105pb/

+0

Ich habe meinen ursprünglichen Post aktualisiert, um den gesamten Code wiederzugeben. – Yamenstein

0

alle gut Ich habe herausgefunden, was falsch war. Aufgrund der Objekte, aus denen das Array People besteht, müssen Sie die spezifische Variable innerhalb des Objekts aufrufen, beispielsweise people [i] .name. Anstelle von Menschen [nur] allein.

Vielen Dank für alle Eingabe :)

Verwandte Themen