我无法从 firebase 操作存储在数组中的数据
I'm unable to manipulate data stored in an array from firebase
我正在使用以下复合查询从 firebase 获取数据:
filterItineraries(filters: any): any {
this.allItineraries = [];
this.filteredItineraries = [];
for ( let i = 0; i < filters.dateRange.length; i ++) {
const query = this.dataSvc.getAllItineraries()
.where('destination', '==', filters.destination)
.where('dateRange', 'array-contains', filters.dateRange[i]);
query.onSnapshot(itineraryListSnapshot => {
itineraryListSnapshot.forEach(snap => {
this.allItineraries.push({
id: snap.id,
activities: snap.data().activities,
destination: snap.data().destination,
startDate: snap.data().startDate,
endDate: snap.data().endDate,
jobId: snap.data().jobId,
userId: snap.data().userId
});
});
});
}
我最初声明了存储对象的数组,如下所示:
私人匹配行程:allItineraries = [];
然后我尝试这样声明:
private allItineraries: { 'id': string, 'activities': any[], 'destination': string, 'startDate': string, 'endDate': string , 'jobId': 字符串, 'userId': 字符串}[] = [];
还是不行。
此问题是由于 firebase 中的查询限制引起的。结果,我得到了需要删除的重复记录。在我从 firebase 检索数据后,无法识别数组函数。我无法获取元素,无法使用 .length...it = 0。当我 console.log(typeof allItineraries) 它显示对象时。
for (let i = 0; i < allItin.length; i++) {
for (let k = 0; k < allItin.length - 1; k++) {
if (allItin[k].id !== allItin[k + 1].id) {
console.log('inside if', allItin[k + 1].id);
this.filteredItineraries[k] = allItin[k + 1];
}
}
}
数据将显示在UI中,但我无法在我的代码中执行任何数组操作。如果我只执行 console.log(allItineraries) 它实际上会显示所有数据,但我需要做的是过滤数据,它不会让我执行任何数组操作。
我已经为此工作了几个星期,并且发布了无数次都无济于事。我现在不知道该怎么办……似乎没有任何效果。我不知道我是否在声明数组错误。可以看到数据,但不能按照普通数组允许的方式对其进行操作。
将数据保存在局部变量中并在快照回调中进行过滤。
filterItineraries(filters: any): any {
for ( let i = 0; i < filters.dateRange.length; i ++) {
const query = this.dataSvc.getAllItineraries()
.where('destination', '==', filters.destination)
.where('dateRange', 'array-contains', filters.dateRange[i]);
query.onSnapshot(itineraryListSnapshot => {
const allItineraries = [];
const filteredItineraries = [];
itineraryListSnapshot.forEach(snap => {
allItineraries.push({
id: snap.id,
activities: snap.data().activities,
destination: snap.data().destination,
startDate: snap.data().startDate,
endDate: snap.data().endDate,
jobId: snap.data().jobId,
userId: snap.data().userId
});
// filter your array here
// save it in state or assign it to filteredItineraries[]
// doing the following won't force state re-render
// this.filteredItineraries = allItineraries.filter(...);
});
});
}
filterItineraries(filters: any): any {
this.allItineraries = [];
this.filteredItineraries = [];
for ( let i = 0; i < filters.dateRange.length; i ++) {
const query = this.dataSvc.getAllItineraries()
.where('destination', '==', filters.destination)
.where('dateRange', 'array-contains', filters.dateRange[i]);
query.onSnapshot(itineraryListSnapshot => {
itineraryListSnapshot.forEach(snap => {
this.allItineraries.push({
id: snap.id,
activities: snap.data().activities,
destination: snap.data().destination,
startDate: snap.data().startDate,
endDate: snap.data().endDate,
jobId: snap.data().jobId,
userId: snap.data().userId
});
});
});
}
我最初声明了存储对象的数组,如下所示:
私人匹配行程:allItineraries = [];
然后我尝试这样声明:
private allItineraries: { 'id': string, 'activities': any[], 'destination': string, 'startDate': string, 'endDate': string , 'jobId': 字符串, 'userId': 字符串}[] = [];
还是不行。
此问题是由于 firebase 中的查询限制引起的。结果,我得到了需要删除的重复记录。在我从 firebase 检索数据后,无法识别数组函数。我无法获取元素,无法使用 .length...it = 0。当我 console.log(typeof allItineraries) 它显示对象时。
for (let i = 0; i < allItin.length; i++) {
for (let k = 0; k < allItin.length - 1; k++) {
if (allItin[k].id !== allItin[k + 1].id) {
console.log('inside if', allItin[k + 1].id);
this.filteredItineraries[k] = allItin[k + 1];
}
}
}
数据将显示在UI中,但我无法在我的代码中执行任何数组操作。如果我只执行 console.log(allItineraries) 它实际上会显示所有数据,但我需要做的是过滤数据,它不会让我执行任何数组操作。
我已经为此工作了几个星期,并且发布了无数次都无济于事。我现在不知道该怎么办……似乎没有任何效果。我不知道我是否在声明数组错误。可以看到数据,但不能按照普通数组允许的方式对其进行操作。
将数据保存在局部变量中并在快照回调中进行过滤。
filterItineraries(filters: any): any {
for ( let i = 0; i < filters.dateRange.length; i ++) {
const query = this.dataSvc.getAllItineraries()
.where('destination', '==', filters.destination)
.where('dateRange', 'array-contains', filters.dateRange[i]);
query.onSnapshot(itineraryListSnapshot => {
const allItineraries = [];
const filteredItineraries = [];
itineraryListSnapshot.forEach(snap => {
allItineraries.push({
id: snap.id,
activities: snap.data().activities,
destination: snap.data().destination,
startDate: snap.data().startDate,
endDate: snap.data().endDate,
jobId: snap.data().jobId,
userId: snap.data().userId
});
// filter your array here
// save it in state or assign it to filteredItineraries[]
// doing the following won't force state re-render
// this.filteredItineraries = allItineraries.filter(...);
});
});
}