【问题标题】:Ionic 3 - How to Merge Array of Objects with valueChanges ObservableIonic 3 - 如何使用 valueChanges Observable 合并对象数组
【发布时间】:2019-07-04 18:14:43
【问题描述】:

我有两个对象数组来合并它们。第一个是 snapshotChanges 检索的结果(参与者),第二个是 valueChanges 检索的结果(usersRoom)。

//First one (participants)
participants = [
  {id: 123, message: 'OK'},
  {id: 456, message: 'Hey'}
];

//Second one (usersRoom)
for(var i=0; i < this.participants.length; i++){
  this.room = this.db.object('users/' + this.participants[i].id).valueChanges();
  this.room.subscribe(
     res => {
        this.usersRoom.push(res);
     });
}

但是当我尝试合并它们时,使用下面的代码,这将返回一个空数组:

this.final = this.usersRoom.reduce((arr, e) => {
      arr.push(Object.assign({}, e, this.participants.find(a => a.id === e.id)))
      return arr;
}, [])

我检查了我是否创建了一个假对象而不是获取 valueChanges,只是为了验证运行上述合并的代码,并且工作正常。

当我在结果中运行 console.log 时,我注意到它们在控制台上以不同的方式出现(请参阅每个的第一行):

//participants
(2) [{…}, {…}]
 0: {id: "123", message: "OK"}
 1: {id: "456", message: "Hey"}
//usersRoom
[]
 0: {name: "John", age: "28", id: "123"}
 1: {name: "Mary", age: "32", id: "456"}

在我看来,两者的格式不同,因此它们最终没有被合并。 那么我该怎么做才能合并它们呢?

【问题讨论】:

    标签: javascript firebase-realtime-database ionic3 angularfire2


    【解决方案1】:

    如果我理解正确,您正在尝试得到这个

    merge(){
        let ids = [];
        let merge_obj = [];
    
        let participants = [
          {id: 123, message: 'OK'},
          {id: 456, message: 'Hey'}
        ];
    
        let usersRoom = [
          {name: "John", age: "28", id: "123"},
          {name: "Mary", age: "32", id: "456"}
        ];
    
        participants.map( (obj) => {
          let index = ids.indexOf(obj.id);
          if( !( index > -1 ) )
          {
            ids.push(obj.id.toString());
          }
        });
    
        usersRoom.map( (obj) => {
          let index = ids.indexOf(obj.id);
          if( !(index > -1 ) )
          {
            merge_obj.push(obj);
          }
          else
          {
            let keys : Array<string> = Object.keys( obj );
            let objMerge = participants.filter( o => {
              if( o.id.toString() == obj.id )
              {
                  let keysMerge : Array<string> = Object.keys( o );
                  keysMerge.forEach( value => {
                    if ( keys.indexOf(value) == -1 ) {
                      obj[value]=o[value];
                    }
                  });
              }
              return obj;
            })
            merge_obj.push(obj);
          }
        });
        console.log(merge_obj);
      }
    

    合并对象

    0: {name: "John", age: "28", id: "123", message: "OK"}
    1: {name: "Mary", age: "32", id: "456", message: "Hey"}
    

    【讨论】:

    • 是的,最终的结果应该是你的 merge_obj 对象。但是,正如我之前提到的,如果我手动创建了两个数组(如您所做的那样),我之前的代码也可以正常工作。问题是,实际上 usersRoom 数组是 valueChanges observable 的结果,因此我无法合并两个数组。
    猜你喜欢
    • 2022-01-27
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2017-01-01
    • 2022-01-27
    • 2020-09-16
    相关资源
    最近更新 更多