QA@IT

titaniumでの連想配列の処理について

2627 PV

いつもお世話になっております。

Tiitaniumで質問なのですが、
あるページへ画面遷移した際に、
Titanium DB に

+----+------+---------+
| id | name | tokuten |
+----+------+---------+
| 1 |  AA  |   100    |
| 2 |  BB  |    50    |
| 3 |  CC  |    95    |
+----+------+---------+

といった内容を保存して、
違うページでは保存した内容を連想配列に入れて、
tokutenを降順でソートして表示するといったソースを書いているのですが、
うまくいきません。
どなたか、ご教授いただけないでしょうか?

var ary ={
  "id":0,
  "name":AA,
  "tokuten":100
};

と直接書くと、連想配列として、処理できるのは確認しているのですが、

while(rows.isValidRow()){
var ary ={
  "id": rows.fieldByName('rowid'),
  "name": rows.fieldByName('name'),
  "tokuten": rows.fieldByName('tokuten')
};
}

と、記述すると、配列に値を代入してくれません。

while(rows.isValidRow()){
    Ti.API.info('id: ' + rows.fieldByName('rowid')
        + ' name: ' + rows.fieldByName('name')
        + ' tokuten' + rows.fieldByName('tokuten'));
    rows.next();
}

として、値が保存されているのは、確認しているのですが・・・。

お手数ですが、どなたか、ご教授いただけないでしょうか?
よろしくお願い致します。

回答

JavaScript は他のプログラミング言語と異なり、 while 文や for 文、 if 文の中で変数を宣言しても、これらの文の外側で参照し、使うことが可能です。記述された

while (rows.isValidRow()) {
  var ary = {
    id: rows.fieldByName("rowid"),
    name: rows.fieldByName("name"),
    tokuten: rows.fieldByName("tokuten")
  };
  rows.next();
}

ですと、実際には、

var ary = {};
while (rows.isValidRow()) {
  ary.id = rows.fieldByName("rowid");
  ary.name = rows.fieldByName("name");
  ary.tokuten = rows.fieldByName("tokuten");
  rows.next();
}
// この下で ary を参照しても最後に得られた結果1つしか入っていないはず!

と同等です。その為、実際には ary に名前と値をセットで保存してはいるのですが、 while 文の中で最後に得られた結果の値が ary にセットされてしまいます。このトラブルを解決する為には名前と値のセットを他の関数に引き渡し、受け取り先の関数の中で本来行いたい処理を書くと良いでしょう。

var kvs = [];
// オブジェクト (≒連想配列) を受け取り、配列に格納する
function addKVS(obj) {
  kvs.push(obj);
}
while (rows.isValidRow()) {
  // addKVS 関数にオブジェクト (≒連想配列) を渡す
  addKVS({
    id: rows.fieldByName("rowid"),
    name: rows.fieldByName("name"),
    tokuten: rows.fieldByName("tokuten")
  });
  rows.next();
}
// ここから下で kvs 配列を使う
// 中身は while 文で回した分のオブジェクト (≒連想配列) が入っている

どうぞよろしくお願いいたします。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。