🦓 残Array.prototype.slice.call()でNodeListオブジェクトを配列化する
作成日: 2021/12/05
1

背景

querySelectorAllなどで要素を取得する際、NodeListで取得され、そのままではforEachが使えなかった
→正確には使えるが、取得したテキストが一文化されてしまっていた
→配列に入れて、区切りたかった

参考記事

・Array.prototype.slice.call(arguments)とは
https://lealog.hateblo.jp/entry/2014/02/07/012014

手順

<ul id="test">
    <li>b</li>
    <li>c</li>
    <li>a</li>
</ul>
<button id="myButton">ソートする</button>
document.getElementById("myButton").onclick=mySort;
function mySort() {

    let myUL = document.getElementById('test');
    let myNodeList = myUL.getElementsByTagName('li')

    //ここでNodeListを配列化している
    var myArray = Array.prototype.slice.call(myNodeList)
    
    //sortロジックを設定
    function compareText(a, b) {
        if(a.textContent > b.textContent) {
            return 1
        } else if(a.textContent < b.textContent){
            return - 1 
        }
        return 0;
    }

    myArray.sort(compareText);
	
	//要素を消去後に追加
    for(let i = 0; i < myArray.length; i++) {
        myUL.appendChild(myUL.removeChild(myArray[i]))
    }
}

一言

sortロジックは癖があるので、以下を参照。
https://goma.pw/article/2015-11-18-0/

Array.prototype.slice.call()にかけることで、配列化できる。
これにより配列のメソッドが使えそう。
→ これまでできなかったソート機能が実装できるかもしれない。

ただし、元の配列を壊す破壊的メソッドについて確認すること。
→ sliceメソッドを使用 → 配列を複製しているので非破壊的?

疑問点

createElementせずに、なぜappendChildができるかを調べる


事業会社にてコーダーをしています。制作は6年目。 インプットしたことをアウトプットしています。