Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@khsk

配列内の特定条件の値群のみ先頭or末尾に集める並び替え

More than 1 year has passed since last update.

要件

  • 配列にn個の要素がある
  • 条件に合う要素のみ、固めて配列の先頭に移動したい
  • 条件に合わない要素の順列は保存する

条件(移動したい値)は複数あるとし、配列で持っていることとする。

結論コード

filter条件に合う配列条件に合わない配列を作ってつなげる。
こちらは非破壊的な方法。

const priority = ['dog', 'cat', 'human']

const target = [
    {id:'caw'},
    {id:'pig'},
    {id:'dog'},
    {id:'car'},
    {id:'cat'},
    {id:'bird'},
    {id:'human'},
]

console.log(
  target.filter( a => priority.includes(a.id)
  ).concat(
    target.filter( b => !priority.includes(b.id))
  )
)
出力
[
  {
    "id": "dog"
  },
  {
    "id": "cat"
  },
  {
    "id": "human"
  },
  {
    "id": "caw"
  },
  {
    "id": "pig"
  },
  {
    "id": "car"
  },
  {
    "id": "bird"
  }
]

sort版

想定していたやりかたができそうになかったので、sortの自作比較関数で行うことに。
破壊的であることが好きな場合に。

Array.prototype.sort() - JavaScript | MDN

const priority = ['dog', 'cat', 'human']

const target = [
    {id:'caw'},
    {id:'pig'},
    {id:'dog'},
    {id:'car'},
    {id:'cat'},
    {id:'bird'},
    {id:'human'},
]

console.log(target.sort((a,b) => {
    const abool = priority.includes(a.id)
    const bbool = priority.includes(b.id)
    if((abool && bbool) || (!abool && !bbool)) {
        return 0
    }
    if (abool) {
        return -1
    }
    return 1
}))

(!abool && !bbool)のパターンを忘れていて非一致値の順番がめちゃくちゃになったりしたので注意。
filter版の対称性のほうがわかりやすい気もするので意図の汲み取りやすさも含めてお好みで。

(filterにあるthisArgがないしsortなのにまったく外部の値を使うのもちょっと不気味なのかもしれない)

当初想定していたやりかた

「条件に合う値だけの配列を削除して返り値にする破壊的関数」を求めたが、調べてもslicefindなど複数まとめて取得できなかったりfilterは非破壊的だったりと一発では行かず。

集めた配列 + あまった配列 で完成させたかったのだが。

mapなどで破壊しながら新しい配列を作ってconcatするぐらいならfilterを反転してそれぞれ作るほうが綺麗かなと結論コードに。

たいしたコストではないが「あまりものの再利用」ができなかったのが少し不満。

他の配列操作系

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
khsk
週一ぐらいでなにか書いていました。 いろいろお休み中。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?