2017-03-31 83 views
0

在Chrome控制檯中執行以下代碼 - 用於Google頁面。Javascript - 減少對象

[].slice.call(document.querySelectorAll("input")) 
         .map(el => el.name?el.name:el.id) 

我看到了這個輸出。

enter image description here

我想這個名單減少到一個對象。

  .reduce((acc,el) => acc[el] = el.toUpperCase(), {}); 

我希望類似下面...

  { 
       "sclient":"SCLIENT", 
       "site":"SITE", 
       ... 
      } 

但只返回最後一個元素。

enter image description here

什麼是錯的這個減少的功能?

+4

回調函數需要返回'acc'。 – 4castle

+0

Thanks @ 4castle ... – KitKarson

回答

2

你回來了acc[el] = el.toUpperCase(),它將返回el.toUpperCase()的值。換句話說,你每次迭代都要返回一個新的字符串。您需要退回您的累加器(acc):

.reduce((acc,el) => { 
    acc[el] = el.toUpperCase(); 
    return acc; 
}, {}); 

讓我知道如果您有任何問題。

+0

'(acc,el)=>(acc [el] = el.toUpperCase(),acc)'也可以。 – 4castle

+0

如果爲虛擬形象註冊並不合適,我會這樣做。 –

0

如果你是單行遊戲的忠實粉絲,並且瀏覽器支持是你最擔心的問題,那麼可以使用Object.assign(ES6)。

.reduce((acc,el) => Object.assign(acc, {[el]: el.toUpperCase()}), {}); 

Object.assign接受一個對象作爲第一個參數,並返回非常相同的對象(全等)。

請注意[el]作爲對象鍵 - a computed property(ES6)。