Подтвердить что ты не робот

Typescript нажать на конкретный ключ в массиве

Я работаю над проектом Angular2, используя Firebase.

Мне нужно нажать все результаты запроса под одним и тем же ключом в this.guestPush.

У меня есть несколько элементов select, которые содержат разные уровни пользователя. 4, 6, 9.

Когда выбран один уровень, результирующий объект сохраняется в массиве 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.

4b9b3361

Ответ 1

В итоге я использовал

 this.guestPush.push({ [i]: { [key]: obj } });

Ответ 2

Похоже, вы получаете ответ массива, и вы назначаете его объекту:

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];
}

Ответ 3

@Ciprian: согласно вашему ответу.

Вам нужно небольшое изменение от вашего кода для использования. Я надеюсь, что это ниже кода достаточно для вас.

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

Ответ 4

Вот ваша проблема,

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.