Что означает "объекты JavaScript могут быть проиндексированы строками"?
var people = new Array();
function People (name, location, age){
this.name = name;
this.location = location;
this.age = age;
}
У меня есть две другие функции для генерации людей и загрузки их в таблицу.
function generatePeople(){}
function loadPeopleIntoTable(){}
Мне нужно в основном просмотреть список людей, взять их имена и затем показать наиболее распространенные имена, которые появляются в этой таблице. Эта функция просто называется commonFirstName().
function commonFirstName(){}
Подсказка: "Объекты JavaScript могут быть проиндексированы строками", но я не понимаю, что это на 100%. Я уже написал код для прохождения массива и поиска общего имени. Но я не могу вызвать массив people, чтобы пройти через этот список - я могу заставить его работать только с созданным вручную массивом в commonFirstName(). Это почему?
Я могу дать некоторые дополнительные разъяснения, если это необходимо.
function commonFirstName(){
alert(people[1]);
//Rest of code that does the occurrences/name here
}
Выход для этого просто [объект объекта].
С другой стороны:
function commonFirstName(){
tempArray = ['John Smith', 'Jane Smith', 'John Black'];
//Run through algorithm for finding common name.
}
Выдает предупреждение "Общее имя: Джон. Происходит 2 раза"
Я думал, что если я просто передам массив людей через функцию, такую как:
function commonFirstName(people){
alert(people[1]);
}
Должен дать мне что-нибудь, что угодно. Я не ожидаю только имя в данный момент, но, по крайней мере, полное имя, местоположение и возраст элемента 1 или одного из них. Он просто не запускается вообще, как будто массив не существует или просто пуст.
Это мой код для всего, что у меня есть:
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);
}
Теперь это работает с массивом fullNames, который находится в функции, но не для массива людей, который состоит из объектов People с именем, местоположением и возрастом (как показано в начале). Мне просто нужно пройти через этот массив, чтобы я мог разделить элементы -_-
3 ответа
"Объекты JavaScript могут быть проиндексированы строками" означает, что объект в JavaScript похож на хеш-таблицу. Имя метода / поля это просто строковый ключ в этой таблице object.anyName
можно записать как object['anyName']
,
Для вашего упражнения вы можете использовать это, чтобы создать счетчик часто используемых имен.
Поскольку это упражнение, я не буду давать вам полный ответ;) Просто идея:
- Для каждого элемента в массиве возьмите имя человека.
- Используйте имя человека в качестве ключа "таблицы", если имя уже есть, сложите единицу со счетчиком.
- В конце концов у вас будет пара имен / вхождений
Если вы очень ленивы в этом упражнении... посмотрите на исходный код функции lodash countBy ( https://github.com/lodash/lodash/blob/4.13.1/lodash.js#L8373), она делает то, что вы необходимость.
Все хорошо, что я понял, что случилось. Из-за объектов, составляющих массив People, вам нужно будет вызвать определенную переменную внутри объекта - например, people[i].name. Вместо людей [я] просто само по себе.
Спасибо за все вклады:)
Что касается вашего редактирования: передача массива в качестве аргумента работает нормально, вам не нужно иметь массив внутри функции:
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);
Проверьте скрипку: https://jsfiddle.net/d2m105pb/