ゴールデンウィーク突入ですね。
世間では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連休の皆さま、どうかくれぐれも、くれぐれも風邪などひかぬようお気をつけ下さい。
お疲れ様でしたー!