web-dev-qa-db-ja.com

Typescript配列の特定のキーにプッシュ

Firebaseを使用してAngular2プロジェクトに取り組んでいます。

すべてのクエリ結果をthis.guestPushの同じキーの下にプッシュする必要があります。

異なるユーザーレベルを含む複数の選択要素があります。 4、6、9。

1つのレベルが選択されると、結果のオブジェクトはguestPush配列に保存されますが、別のレベルが選択されると、次のエラーが発生します。

私はこのエラーを受け取ります:

エラーTypeError:this.guestPush [( "filter" + i)]。Pushは関数ではありません

これが私のコードです:

  guestPush: any[] = new Array;

  level.forEach((lvl, index) => {

    this.db.object(`levelsUsers/${lvl}/users`)
      .subscribe(users => {

        if (this.guestPush['filter_' + i]) {
          this.guestPush['filter_' + i].Push(users);
        } else {
          this.guestPush['filter_' + i] = users;
        }

      }, err => console.log(err));

  });

編集***

フィルターに一致するユーザーを含むユーザーオブジェクト:

Object {-KmSjAaxdCUvrPEQ8InI: Object, $key: "users", $exists: function}
  -KmSjAaxdCUvrPEQ8InI: Object
    admin:"false"
    description:"desc"
    ...
    ...
    verified:false
  __proto__:Object
  exists:function ()
  $key:"users"
  __proto__:Object

そしてthis.guestPush[i] = users;は次のようなオブジェクトを作成します:

[Object]
 0:Object
 -KmSjAaxdCUvrPEQ8InI: Object
    admin:"false"
    description:desc"
    ...
    ...
    verified:false
    __proto__:Object
  $exists:function ()
  $key:"users"
  __proto__:Object
 length:1
 __proto__:Array(0)

したがって、次のループでは、-KmSjAaxdCUvrPEQ8InIキーの値として追加されている限り、0または何かの横に新しいユーザーオブジェクトを追加します。

13
Ciprian

私は結局使用しました

 this.guestPush.Push({ [i]: { [key]: obj } });
9
Ciprian

配列応答を取得していて、それをオブジェクトに割り当てているようです:

this.guestPush['filter_' + i] = users;

そう this.guestPush['filter_'+ i]は配列型になりました。別のusersオブジェクトを追加したい場合は、基本的に別の配列を既存の配列に追加しています。その場合、concatを使用すべきではありませんか?

if (this.guestPush['filter_' + i]) {
    this.guestPush['filter_' + i].concat(users);
} else {
    this.guestPush['filter_' + i] = users;
}

usersが配列でない場合は、

if (this.guestPush['filter_' + i]) {
    this.guestPush['filter_' + i].Push(users);
} else {
    this.guestPush['filter_' + i] = [users];
}
11
Vamshi

@Ciprian:あなたの答えに従って。

使用するには、コードを少し変更する必要があります。以下のコードで十分です。

let key ='filter_';
this.guestPush.Push({ key + i : users });
2

ここにあなたの問題があります、

guestPush: any[] = new Array;
'filter_' + i // this will yield a string.
this.guestPush['filter_' + i])

オブジェクトを定義できます:

let name = {};
name['x'] = 'blah';
or name.x = 'blahblah'; // name.x does same thing as name['x']

あなたの考えだと思いますname['x'] = 'blah';は、オブジェクト構文の場合は配列です。

したがって、 Dictionary の実装について考える必要があります。

2
JGFMK

TypeScript配列の特定のキーにプッシュ

配列でspliceメソッドを使用する必要がありますhttps://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

1
basarat