2017-03-31 16 views
0

クロムコンソールで以下のコードを実行します - 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

ありがとう@ 4castle ... – KitKarson

答えて

2

acc[el] = el.toUpperCase()を返すと、el.toUpperCase()の値が返されます。つまり、繰り返しごとに新しい文字列を返します。アキュムレータを返却する必要があります。

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

問題がある場合はお知らせください。

+0

'(acc、el)=>(acc [el] = el.toUpperCase()、acc)'も動作します。 – 4castle

+0

もしアバターのためにアップヴォートすることが不適切でないなら、私はそれをやります。 –

0

1ライナーの大ファンであり、ブラウザのサポートが不安な場合は、Object.assign(ES6)を使用できます。

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

Object.assign最初の引数としてオブジェクトを受け取り、そして非常に同じオブジェクト(厳密な等価)を返します。

オブジェクトキーには[el] - computed property(ES6)に注意してください。

関連する問題