Realmが返すオブジェクトについて

ゴールデンウィーク突入ですね。
世間では5/1、2を休みにすると9連休なんて言ってますが、どうやら私は宝くじ当選とはならなかったようです。笑
てことで、5/1、2もバリバリ働く人たちのために、本日はRealmが返す値が、あれ、配列じゃないんだ、って話ですw
対象は、RealmのJavaScript版です。

最近、react-nativeを勉強し初めまして、Realmについても触っていたのですが、
データ取得して際、data.length>0なんて使ってるもんですから、てっきりレコードが配列で返ってきてるもんだと思ってました。
だが、実は違う!何故なら、

Array.isArray(data)  // => false

とやっても、falseになるから!

いやはや、こいつは一本取られましたぜ。
公式のIntroductionにも記載があるのですが、

https://realm.io/docs/javascript/latest/#introduction
// Query Realm for all cars with a high mileage
const cars = realm.objects('Car').filtered('miles > 1000');

// Will return a Results object with our 1 car
cars.length // => 1

そう、cars.lengthで問題なくlengthが取得できるのです。
きっとちゃんとドキュメント読めば、返すオブジェクトについても書いてあるんだと思います!w

ま、とりあえず、色々試してみたのです。(上記carsを例えにして)

// 配列確認
Array.isArray(new Array())  // => true
Array.isArray(cars)  // => false

// 文字列で型を確認
Object.prototype.toString.call(new Array())  // => [object Array]
Object.prototype.toString.call(cars)  // => [object object]

// filterなし => 結果は同じ
Array.isArray(realm.objects('Car'))  // => false
Object.prototype.toString.call(realm.objects('Car'))  // => [object object]

// filter条件に合致しない場合 => やはり結果は同じ
Array.isArray(realm.objects('Car').filtered('miles < 0'))  // => false
Object.prototype.toString.call(realm.objects('Car').filtered('miles < 0'))  // => [object object]

// 中身を確認してみる
Object.keys(cars).forEach((k) => {
  console.log('key: ' + k + ' val: ' + cars[k]);  // => key: 0 val: [object Object]
});

// さらに深くみると
Object.keys(cars).forEach((k) => {
  let car = cars[k];
  Object.keys(car).forEach((k) => {
    console.log('key: ' + k + ' val: ' + cars[k]);
    // => key: make val: Honda
    // => key: model val: Civic
    // => key: miles val: 1020
  });
});

// そのままforEachも使える
cars.forEach((val) => {
  console.log('make: ' + val.make);  // => make: Honda
});

まず、返ってくる値は配列ではなく、Objectです。
中身を確認すると、key:0に取得したレコードのオブジェクトが存在しているようです。
取得したデータが複数ある場合は、単純に、0,1,2…N番目のkeyの値に取得データがオブジェクトで格納されるようです。
ただのオブジェクトと違うのは、配列のようにlengthやforEachを備えてることですね。
きっと、realmの中身を追うと、そういった関数を実装してくれてるんだと思います(推測ですが。。面倒なので追いませんw

ということで、Realmの返すオブジェクトについてでした。
では、9連休の皆さま、どうかくれぐれも、くれぐれも風邪などひかぬようお気をつけ下さい。
お疲れ様でしたー!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です