9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JXAで子要素のプロパティを一気に得る

Last updated at Posted at 2015-02-17

複数形のプロパティから子要素のプロパティを呼ぶと、一気に子要素のプロパティを配列として得られることにいまさら気づきました。

一気に子要素のnameを取得
Safari = Application("Safari");

winNames = Safari.windows.name();
//=> ["お気に入り", "お気に入り", "お気に入り"]

子要素の子要素のプロパティも一気に取得できます。

子要素の子要素も可
tabsNames = Safari.windows.tabs.name()
//=> [["お気に入り"], ["お気に入り"], ["お気に入り", "お気に入り", "お気に入り", "お気に入り"]]

今まではArray.mapを使ってこう書いてました。

今まで
winNames = Safari.windows().map(function(win){
  return win.name();
});

大幅なコード削減が期待できそうです。死にたい。
しかも動作がmapよりぜんぜん軽い気がする。

複数形のプロパティに()をつけた時点で配列になるので、つけたら出来ませんよ。

複数形のプロパティに()をつけたらもう配列
Safari.windows instanceof Array //=> false
Safari.windows() instanceof Array //=> true

//>> winNames = Safari.windows().name();
//!! Error on line 1: TypeError: undefined is not a function (evaluating 'Safari.windows().name()')

複数形のプロパティから.get()が呼べないのはこれが理由だったのかな。
単数形のプロパティに()をつけた場合は.get()が呼び出されるので、それと同じく複数形のプロパティに()をつけて配列を取得する際も.get()が呼び出されると思って試してみたら.get()を呼べなかったので不思議に思ってました。

(追記: .lengthは取得できません。複数形のプロパティ自体に.lengthがあるからです。)

(追記: .properties()はエラーで無理でした。複数形のプロパティ自体の.properties()を読み出そうとするからでしょうか。)

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?