kooh-q-hook

いわゆる一つの技術メモ

SharePoint JSOM でコレクションに対して列挙操作を行う

SharePoint JSOM(JavaScript クライアント オブジェクト モデル)の基本操作の一つであり、
おそらくは最も頻繁に使用される処理ではないかと思います。

MSDN にもサンプルコードの例が載っています。
SharePoint 2013 の JavaScript ライブラリ コードを使用して基本的な操作を完了する

確かにこのサンプルコードは問題なく動作するのですが、
コレクション系のオブジェクトを列挙する部分はこのようになっています(イメージです)。

var collection; // 結果のコレクション

// 非同期で collection に結果をロード
someLoadProcess().then(function() {
  var enumerator = collection.get_Enumerator();
  var current;
  while (enumerator.moveNext()) {
    current = enumerator.get_current();
  }
});

別に Enumerator を内部的に実装しているのは良いのです。
ただ、頻繁に使う処理がこんなに面倒なのはちょっといただけません。
正直、Enumerator を直接操作するメリットを感じません。

と、疑問に思いながらも数年間、代替方法を見出せずにいたのですが、
最近になってやっと判明したのでメモしておきます。

var collection; // 結果のコレクション

// 非同期で collection に結果をロード
someLoadProcess().then(function() {
  collection.get_data().forEach(function(current) {
  });
});

結果のコレクションは、型が SP.XXXCollection という名前です。

先述のサンプルコードでは、SP.ListItemCollection が該当します。
SP.ListItemCollection object

SP.XXXCollection は、prototype に get_data メソッドが定義されている
SP.ClientObjectCollection を継承しています。data とは。

そして、この get_data メソッドは、Array<SP.XXX> を返します。
つまり結果のコレクションの要素が格納された配列が取得できるということです。

ちなみにこの処理は Enumerator から新たに配列を生成しているわけではなく、
結果のロードが完了した時点で各要素が設定されている(隠し)配列を返しているだけです。

SharePoint JSOM のコレクションは get_data すれば配列が取れる、ということだけ覚えておけばよさそうです。
MSDN等のAPIリファレンスには載っていない情報なので、自己責任でご利用ください。