配列内の特定条件の値群のみ先頭or末尾に集める並び替え - Qiita
で並び替えたものの、どこまでが並び替えられた値なのかを知っておきたくなったので、オブジェクトなのをいいことにマークすることに
コード
const priority = ['dog', 'cat', 'human']
const target = [
{id:'caw'},
{id:'pig'},
{id:'dog'},
{id:'car'},
{id:'cat'},
{id:'bird'},
{id:'human'},
]
console.log(target2.filter( a => {
if (priority.includes(a.id)) {
a.isSorted = true
return true
}
}).concat(target2.filter( b => !priority.includes(b.id))))
[
{
"id": "dog",
"isSorted": true
},
{
"id": "cat",
"isSorted": true
},
{
"id": "human",
"isSorted": true
},
{
"id": "caw"
},
{
"id": "pig"
},
{
"id": "car"
},
{
"id": "bird"
}
]
たまたまオブジェクト対象だったのでboolを生やすことにしましたが、filter中のこのような変更が可能だったのかが多少不明瞭でした。
filterのMDNでは
filter() は呼び出された配列を変化させません。
filter() によって処理される配列要素の範囲は、callback が最初に呼び出される前に設定されます。filter() の呼び出しが開始された後に追加された配列要素に対しては、callback は実行されません。既存の配列要素が変更または削除された場合、callback に渡される値は filter() がそれらを参照した時点での値になります。削除された配列要素を参照することはありません。
とありますが、感覚的にはconst array
なイメージですね。
内部の値への干渉はできるのですが、
Array.prototype.filter() - JavaScript | MDN#初期の配列への影響 (変更、追加、削除)
地味にcallback(element)
を変更するサンプルがなかったので残しておきます。