Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.06.2016, 00:46
Новичок на форуме
Отправить личное сообщение для Aleksandr Kosarchuk Посмотреть профиль Найти все сообщения от Aleksandr Kosarchuk
 
Регистрация: 12.06.2016
Сообщений: 2

Помогите разобраться со скриптом.
Решил расширить свои знания в области JavaScript с помощью учебника Выразительный Javascript (Eloquent JavaScript).И вот не могу понять почему код не работает. Совершенно одинаковые данные обрабатываются по разному.
Файл с кодом прилагается.
Там две функции одна ищет самого старого человека из массива
А вторая выводит всех людей кто старше 90 лет.
Заранее благодарю за помощь.
Вложения:
Тип файла: txt code.txt (5.9 Кб, 12 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 12.06.2016, 02:46
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Aleksandr Kosarchuk,
давай выкладывай код с комментами, где непонятно. файлы твои не нужны
Ответить с цитированием
  #3 (permalink)  
Старый 12.06.2016, 10:15
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Aleksandr Kosarchuk, 1-ая функция ищет не самого старого, а того, кто раньше всех из них родился. В итоге мы получаем не массив, как ты думаешь, а object и у него нет свойства "length". Поэтому обращаться надо к нему так:
console.log(reses.name); //а не reses.length
//Следующее ничего не выдаёт, т.к. reses - это объект, а не массив:
console.log(map(reses, function(person)
{
	return person.name;
}));

Обе функции работают так как и задано, но в 1-ом случае ты спутал массив с объектом.

Вторая выводит 3-х человек, которым больше 90 лет:
Clara Aernoudts, Emile Haverbeke, Maria Haverbeke

Тут overNinety является массивом с 3 объектами.

В общем, вот твой исправленный скрипт:
var ANCESTRY_FILE = "[\n  " + [
  '{"name": "Carolus Haverbeke", "sex": "m", "born": 1832, "died": 1905, "father": "Carel Haverbeke", "mother": "Maria van Brussel"}',
  '{"name": "Emma de Milliano", "sex": "f", "born": 1876, "died": 1956, "father": "Petrus de Milliano", "mother": "Sophia van Damme"}',
  '{"name": "Maria de Rycke", "sex": "f", "born": 1683, "died": 1724, "father": "Frederik de Rycke", "mother": "Laurentia van Vlaenderen"}',
  '{"name": "Jan van Brussel", "sex": "m", "born": 1714, "died": 1748, "father": "Jacobus van Brussel", "mother": "Joanna van Rooten"}',
  '{"name": "Philibert Haverbeke", "sex": "m", "born": 1907, "died": 1997, "father": "Emile Haverbeke", "mother": "Emma de Milliano"}',
  '{"name": "Jan Frans van Brussel", "sex": "m", "born": 1761, "died": 1833, "father": "Jacobus Bernardus van Brussel", "mother":null}',
  '{"name": "Pauwels van Haverbeke", "sex": "m", "born": 1535, "died": 1582, "father": "N. van Haverbeke", "mother":null}',
  '{"name": "Clara Aernoudts", "sex": "f", "born": 1918, "died": 2012, "father": "Henry Aernoudts", "mother": "Sidonie Coene"}',
  '{"name": "Emile Haverbeke", "sex": "m", "born": 1877, "died": 1968, "father": "Carolus Haverbeke", "mother": "Maria Sturm"}',
  '{"name": "Lieven de Causmaecker", "sex": "m", "born": 1696, "died": 1724, "father": "Carel de Causmaecker", "mother": "Joanna Claes"}',
  '{"name": "Pieter Haverbeke", "sex": "m", "born": 1602, "died": 1642, "father": "Lieven van Haverbeke", "mother":null}',
  '{"name": "Livina Haverbeke", "sex": "f", "born": 1692, "died": 1743, "father": "Daniel Haverbeke", "mother": "Joanna de Pape"}',
  '{"name": "Pieter Bernard Haverbeke", "sex": "m", "born": 1695, "died": 1762, "father": "Willem Haverbeke", "mother": "Petronella Wauters"}',
  '{"name": "Lieven van Haverbeke", "sex": "m", "born": 1570, "died": 1636, "father": "Pauwels van Haverbeke", "mother": "Lievijne Jans"}',
  '{"name": "Joanna de Causmaecker", "sex": "f", "born": 1762, "died": 1807, "father": "Bernardus de Causmaecker", "mother":null}',
  '{"name": "Willem Haverbeke", "sex": "m", "born": 1668, "died": 1731, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}',
  '{"name": "Pieter Antone Haverbeke", "sex": "m", "born": 1753, "died": 1798, "father": "Jan Francies Haverbeke", "mother": "Petronella de Decker"}',
  '{"name": "Maria van Brussel", "sex": "f", "born": 1801, "died": 1834, "father": "Jan Frans van Brussel", "mother": "Joanna de Causmaecker"}',
  '{"name": "Angela Haverbeke", "sex": "f", "born": 1728, "died": 1734, "father": "Pieter Bernard Haverbeke", "mother": "Livina de Vrieze"}',
  '{"name": "Elisabeth Haverbeke", "sex": "f", "born": 1711, "died": 1754, "father": "Jan Haverbeke", "mother": "Maria de Rycke"}',
  '{"name": "Lievijne Jans", "sex": "f", "born": 1542, "died": 1582, "father":null, "mother":null}',
  '{"name": "Bernardus de Causmaecker", "sex": "m", "born": 1721, "died": 1789, "father": "Lieven de Causmaecker", "mother": "Livina Haverbeke"}',
  '{"name": "Jacoba Lammens", "sex": "f", "born": 1699, "died": 1740, "father": "Lieven Lammens", "mother": "Livina de Vrieze"}',
  '{"name": "Pieter de Decker", "sex": "m", "born": 1705, "died": 1780, "father": "Joos de Decker", "mother": "Petronella van de Steene"}',
  '{"name": "Joanna de Pape", "sex": "f", "born": 1654, "died": 1723, "father": "Vincent de Pape", "mother": "Petronella Wauters"}',
  '{"name": "Daniel Haverbeke", "sex": "m", "born": 1652, "died": 1723, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}',
  '{"name": "Lieven Haverbeke", "sex": "m", "born": 1631, "died": 1676, "father": "Pieter Haverbeke", "mother": "Anna van Hecke"}',
  '{"name": "Martina de Pape", "sex": "f", "born": 1666, "died": 1727, "father": "Vincent de Pape", "mother": "Petronella Wauters"}',
  '{"name": "Jan Francies Haverbeke", "sex": "m", "born": 1725, "died": 1779, "father": "Pieter Bernard Haverbeke", "mother": "Livina de Vrieze"}',
  '{"name": "Maria Haverbeke", "sex": "m", "born": 1905, "died": 1997, "father": "Emile Haverbeke", "mother": "Emma de Milliano"}',
  '{"name": "Petronella de Decker", "sex": "f", "born": 1731, "died": 1781, "father": "Pieter de Decker", "mother": "Livina Haverbeke"}',
  '{"name": "Livina Sierens", "sex": "f", "born": 1761, "died": 1826, "father": "Jan Sierens", "mother": "Maria van Waes"}',
  '{"name": "Laurentia Haverbeke", "sex": "f", "born": 1710, "died": 1786, "father": "Jan Haverbeke", "mother": "Maria de Rycke"}',
  '{"name": "Carel Haverbeke", "sex": "m", "born": 1796, "died": 1837, "father": "Pieter Antone Haverbeke", "mother": "Livina Sierens"}',
  '{"name": "Elisabeth Hercke", "sex": "f", "born": 1632, "died": 1674, "father": "Willem Hercke", "mother": "Margriet de Brabander"}',
  '{"name": "Jan Haverbeke", "sex": "m", "born": 1671, "died": 1731, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}',
  '{"name": "Anna van Hecke", "sex": "f", "born": 1607, "died": 1670, "father": "Paschasius van Hecke", "mother": "Martijntken Beelaert"}',
  '{"name": "Maria Sturm", "sex": "f", "born": 1835, "died": 1917, "father": "Charles Sturm", "mother": "Seraphina Spelier"}',
  '{"name": "Jacobus Bernardus van Brussel", "sex": "m", "born": 1736, "died": 1809, "father": "Jan van Brussel", "mother": "Elisabeth Haverbeke"}'
].join(",\n  ") + "\n]";

var ancestry = JSON.parse(ANCESTRY_FILE);

function map (array,transform)
{
	var mapped = [];
	console.log(array.length);
	for (var i = 0; i < array.length; i++)
	{
		mapped.push(transform(array[i]));
	}
	return mapped;
}

var reses = ancestry.reduce(function(min, cur)
{
	if (cur.born < min.born) return cur;
	else return min;
});
console.log(reses.name);//.length
/*
console.log(map(reses, function(person)
{
	return person.name;
}));
*/

var overNinety = ancestry.filter(function(person)
{
	return person.died - person.born > 90;
});
console.log(overNinety.length);
console.log(map(overNinety, function(person)
{
	return person.name;
}));
Ответить с цитированием
  #4 (permalink)  
Старый 12.06.2016, 11:31
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от Rise Посмотреть сообщение
Aleksandr Kosarchuk, в reses ожидается массив, а получается объект, исправим это:
var reses = [ancestry.reduce(function(min, cur) {
	if (cur.born < min.born) return cur;
	else return min;
})];

Rise, это вообще лишнее - заключать объект в массив! И ожидается там объект, а не массив. Отсюда мы сразу у объекта спрашиваем его имя: reses.name. Поэтому обращение к функции "map" тоже лишнее.
Ответить с цитированием
  #5 (permalink)  
Старый 12.06.2016, 11:48
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от Rise Посмотреть сообщение
Где там? Там в последующем коде ожидается массив.

Rise, смотря кем ожидается! Если ошибающимся человеком, то да, возможно! НО программе даны чёткие указания:
return cur; //cur - это объект
Ответить с цитированием
  #6 (permalink)  
Старый 12.06.2016, 12:14
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от Rise Посмотреть сообщение
pureJS, последующий

Rise, не надо язвить! Учись общаться вежливо! И прежде чем отвечать постарайся прочитать и понять то, что тебе ответили. Я ясно и доходчиво написал:
Сообщение от pureJS Посмотреть сообщение
Отсюда мы сразу у объекта спрашиваем его имя: reses.name. Поэтому обращение к функции "map" тоже лишнее.

И написано это было мной раньше, чем твоё сообщение про "последующий".
Ответить с цитированием
  #7 (permalink)  
Старый 12.06.2016, 13:52
Новичок на форуме
Отправить личное сообщение для Aleksandr Kosarchuk Посмотреть профиль Найти все сообщения от Aleksandr Kosarchuk
 
Регистрация: 12.06.2016
Сообщений: 2

Спасибо за помощь.
pureJS, Rise. Спасибо за то что посмотрели код и нашли ошибку.
Ответить с цитированием
  #8 (permalink)  
Старый 12.06.2016, 15:47
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

pureJS,
Тогда бы уже так что-ли:

var ancestry = JSON.parse(ANCESTRY_FILE);

var reses = ancestry.reduce(function (min, cur) {
	if (cur.born < min.born) return cur;
	
    return min;
});

console.log(reses.name);

var overNinety = ancestry.filter(function (person) {
	return (person.died - person.born > 90);
}).map(function (person) {
	return person.name;
});

console.log(overNinety);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с скриптом alex72bel Общие вопросы Javascript 9 11.02.2016 13:44
Помогите разобраться со скриптом Валерий1996 Общие вопросы Javascript 7 13.07.2015 21:41
Подсчёт дней до конца акции - помогите разобраться со скриптом Chataine Общие вопросы Javascript 0 24.07.2011 14:48
Помогите разобраться со скриптом alinastil Элементы интерфейса 1 02.04.2011 18:41
Помогите разобраться со скриптом! Чайник Элементы интерфейса 1 13.03.2009 23:57