不加阵列

时间:2017-01-30 08:55:59

标签: javascript arrays concatenation ionic2

我有一个Firebase服务提供程序函数,它通过promise对象返回一组数据:

getPreviousChats(groupKey: string, offset: string): Promise<any> {
  return new Promise((resolve, reject) => {
    // let previousChats: Array<any> = [];
    let previousChats: any[] = [];
    const chatRef = this.chatsRef.child(groupKey).orderByKey().endAt(offset).limitToLast(5);
    chatRef.once('value', snapshot => {
      snapshot.forEach(childSnapshot => {
        previousChats.push({
          id: childSnapshot.key,
          message: childSnapshot.val().message,
          createTime: childSnapshot.val().createTime
        });
        return false; // forEach returns boolean
      });
    });
    resolve(previousChats);
  });
}

同时,Ionic页面功能调用getPreviousChats()来检索以前的聊天数据,并通过unshift()将其添加到当前页面布局中:

loadPreviousChats(refresher) {
  this.dataService.getPreviousChats(this.groupKey, this.chats[0].id).then(data => {
    this.chats.unshift(data);
  }, (error) => {
    console.log('loadPreviousChats error: ', JSON.stringify(error));
  });
  setTimeout(() => {
    console.log('Async operation has ended');
    refresher.complete();
  }, 1000); 
}

不幸的是,不知怎的this.chats.unshift(data);data插入到当前this.chats数组的前面,并增加了一层数组:

this.chats:  Array[6]
              0: Array[5]
                0: Object
                1: Object
                2: Object
                3: Object
                4: Object
                 length: 5
                 __proto__: Array[0]
              1: Object
              2: Object
              3: Object
              4: Object
              5: Object
               length: 6
               __proto__: Array[0]

那么,我在这里错过了什么?

2 个答案:

答案 0 :(得分:1)

  

那么,我在这里错过了什么?

这就是unshift的作用:它取你给它的值并将其插入数组的开头。你给它的值是一个数组引用,所以它在数组中的含义。

如果您想这些条目附加到this.chats,您可以使用push执行此操作;在ES5及更早版本中它有点尴尬:

this.chats.push.apply(this.chats, data);

在ES2015 +中使用扩展语法更加清晰:

this.chats.push(...data);

附注:您还会成为this problem的牺牲品:在调用getPreviousChats回调之前,您在once过早解决您的承诺(I&I #39; m假设它是异步操作,否则使用类似的回调似乎很奇怪。将resolve电话移至回调中。

答案 1 :(得分:1)

我想你可以将新的数组项插入现有的数组:

let chats = [...newChats, ...oldChats]; //or oldChats first

或者,你可以像这样使用concat:

let chats = oldChats.concat(newChats);

我更喜欢方法一,因为它创建了每个数组的吞咽副本,而不修改原件。