querySelectorAll

querySelectorAllについてのおまとめ

こんなインプット要素を持つページがあったとして…

<!DOCTYPE html>
  <body>
    <div>
      <input type="text" id="id" />
      <input type="text" id="name" />
    </div>
  </body>
</html>

querySelectorAllで値を取得すると、nodeListが返ってくる

const getInput = document.querySelectorAll("input");
 NodeList(2) [input#id, input#name]

forEachで回す

これは元々備わっていますね

getInput.forEach(value=>console.log(value.id))
 id
 name

mapで回す

mapは備わっていませんが、スプレッド構文で展開したものを配列にすると、mapで回せます

[...getInput].map(value=>value.id)
 ['id', 'name']

オブジェクトにしたい

idと入力値のオブジェクトを作りたいときは、Object.fromEntries()が使えそうです。

Object.fromEntries()

Object.fromEntries() は、[値,キー]のリストをオブジェクトにできます。

Object.fromEntries([["id",1],["name","hasi"]])
 {id: 1, name: 'hasi'}

mapと組み合わせて

mapと組み合わせてオブジェクトにしてみます。

Object.fromEntries([...getInput].map(value=>[value.id,value.value]))
{id: 'あ', name: 'い'}

他にも書き方はありそうですね。

途中の疑問

記事書いてる途中、こんな配列を処理したことなかったっけな…?これどうやってObjectにするのかな?って思ったけど、良い書き方が思い浮かばなかった。

obj = [{id: 1},{name: 'hasi'}]
0: {id: 1}
1: {name: 'hasi'}

一応書いてみたけど、なんじゃこりゃ…。

Object.fromEntries(obj.map(value=>[Object.keys(value),Object.values(value)].flat()))
{id: 1, name: 'hasi'}

今度調べておこうか…。
ちなみに、前処理した気がすると思っていたのは完全に勘違いだったのでした。30分ぐらい考えてしまった。