2017-02-11 5 views
0

Это код решения из упражнения в книге «Красноречивый JavaScript». Это код из главы 5, и это упражнение 2.Как использовать нотацию объекта для создания нового объекта с помощью JavaScript.

Я знаю, что byName объект строится с использованием метода forEach. Я понимаю это. Тем не менее, обозначение скобки объекта трудно понять, потому что я не знаю, как используется локальная переменная person.

Внутри переменной differences используется метод filter и используется метод map, и я понимаю, как они используются. Однако я не знаю значения локальной переменной person, и я не знаю, как используется объект byName.

function average(array) { 
    function plus(a, b) { return a + b; } 
    return array.reduce(plus)/array.length; 
} 

var byName = {}; 
ancestry.forEach(function(person) { 
    byName[person.name] = person; 
}); 

var differences = ancestry.filter(function(person) { 
    return byName[person.mother] != null; 
}).map(function(person) { 
    return person.born - byName[person.mother].born; 
}); 

console.log(average(differences)); 
// 31.2 

Как это byName объект включаются в методе filter и метод forEach? Каково значение локальной переменной person в рамках метода filter и метода forEach.

ответ

0

У вас есть массив объектов (ancestry), каждый из которых представляет собой Person. У человека есть свойство, называемое матерью, у которой есть имя его матери (это строка).

Для того, чтобы перейти от имени матери к фактическому объекту Person, который представляет мать, вам необходимо создать карту, у которой есть ключи, являющиеся именем и значением лица, являющимся объектом person (byName, созданным в forEach).

Функция фильтра возвращает новый массив, в котором содержатся только люди, у которых действительно есть действительная мать (в этом имени есть материнский объект в реестре byName). Используя этот новый список объектов [действительного человека/матери], мы вычисляем разницу по возрасту для всех из них (функцию карты), взяв свойство, родившееся на родине, и вычитаем материнское свойство (byname[person.mother].born)

Надеюсь, т сделать вещи более сложным ..


код предполагает, что родословная представляет собой массив объектов с этой структурой:

[{ 
    name: 'John Doe' 
    born: 2, 
    mother: 'Jane Doe' 
}, 
{ 
    name: 'Jane Doe' 
    born: 1, 
    mother: null 
}] 

И после Foreach, закончилась byName будет:

{ 
    'John Doe': { 
    name: 'John Doe', 
    born: 2, 
    mother: 'Jane Doe' 
    }, 
    'Jane Doe': { 
    name: 'Jane Doe', 
    born: 1, 
    mother: null, 
    } 
} 

Фильтр возвращает новый список:

[{ 
    name: 'John Doe', 
    born: 2, 
    mother: 'Jane Doe' 
}] 

Обратите внимание, как он избавился от Jane Doe, потому что мать собственность не является действительным.

Функция карты перебрать новый массив возвращается из фильтра только один пункта «John Doe» и person.mother имеет значение «Jane Doe» и byName имеет свойство Jane Doe так byName[person.mother] вернет:

{ 
    name: 'Jane Doe', 
    born: 1, 
    mother: null 
} 
+0

Ваш первый и третий параграфы были полезны. Однако мне нужно уточнить ваш второй абзац. Я на правильном пути, когда я говорю, что метод «forEach» создает соединение, в котором говорится, что «Джейн Доу» является матерью «john doe»?Если да, то как это делается? Синтаксис 'byName [person.name] = person;' все еще меня смущает. –