Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться со скриптом. (https://javascript.ru/forum/misc/63509-pomogite-razobratsya-so-skriptom.html)

Aleksandr Kosarchuk 12.06.2016 00:46

Помогите разобраться со скриптом.
 
Вложений: 1
Решил расширить свои знания в области JavaScript с помощью учебника Выразительный Javascript (Eloquent JavaScript).И вот не могу понять почему код не работает. Совершенно одинаковые данные обрабатываются по разному.
Файл с кодом прилагается.
Там две функции одна ищет самого старого человека из массива
А вторая выводит всех людей кто старше 90 лет.
Заранее благодарю за помощь.

Coriolan161 12.06.2016 02:46

Aleksandr Kosarchuk,
давай выкладывай код с комментами, где непонятно. файлы твои не нужны

pureJS 12.06.2016 10:15

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;
}));

Rise 12.06.2016 10:44

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

pureJS 12.06.2016 11:31

Цитата:

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


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

Rise 12.06.2016 11:39

Цитата:

Сообщение от pureJS (Сообщение 419133)
И ожидается там объект, а не массив.

Где там? Там в последующем коде ожидается массив.

pureJS 12.06.2016 11:48

Цитата:

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


Rise, смотря кем ожидается! Если ошибающимся человеком, то да, возможно! НО программе даны чёткие указания:
return cur; //cur - это объект

Rise 12.06.2016 11:55

pureJS, последующий

pureJS 12.06.2016 12:14

Цитата:

Сообщение от Rise (Сообщение 419140)


Rise, не надо язвить! Учись общаться вежливо! И прежде чем отвечать постарайся прочитать и понять то, что тебе ответили. Я ясно и доходчиво написал:
Цитата:

Сообщение от pureJS (Сообщение 419133)
Отсюда мы сразу у объекта спрашиваем его имя: reses.name. Поэтому обращение к функции "map" тоже лишнее.


И написано это было мной раньше, чем твоё сообщение про "последующий".

Rise 12.06.2016 12:40

pureJS, стараюсь понять но не могу, помоги мне понять тебя.


Часовой пояс GMT +3, время: 18:06.