簡體   English   中英

如何使用對象表示法通過JavaScript構建新對象。

[英]How to use object notation to build a new object with JavaScript.

這是“ Eloquent JavaScript”一書中一個練習的解決方案代碼。 這是來自第5章的代碼,它是練習2。

我知道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方法中? filter方法和forEach方法中,局部變量person的值是多少。

您有一個對象數組( ancestry ),每個對象代表一個Person 人有一個稱為母親的財產,有他/她母親的名字(是一個字符串)。

為了從一個人的母親的名字轉到代表該母親的實際Person對象,您需要創建一個映射,該映射的鍵是人的名字,值是人的對象(byName,在forEach中創建)。

篩選器函數返回一個新的Array,該Array僅容納實際擁有有效母親的人員(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因為母親財產無效。

map函數將遍歷從過濾器返回的新數組,其中只有一項“ John Doe”,並且person.mother的值為“ Jane Doe”, byName的屬性為Jane Doe因此byName[person.mother]將返回:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM