Ответ 1
В итоге я использовал
this.guestPush.push({ [i]: { [key]: obj } });
Я работаю над проектом 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
.
В итоге я использовал
this.guestPush.push({ [i]: { [key]: obj } });
Похоже, вы получаете ответ массива, и вы назначаете его объекту:
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];
}
@Ciprian: согласно вашему ответу.
Вам нужно небольшое изменение от вашего кода для использования. Я надеюсь, что это ниже кода достаточно для вас.
let key ='filter_';
this.guestPush.push({ key + i : users });
Вот ваша проблема,
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.
Typescript нажмите на конкретный ключ в массиве
Вам нужно использовать метод splice
для массива: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice