Ionic 3 - Как объединить массив объектов со значениями наблюдаемых изменений - PullRequest
0 голосов
/ 03 июля 2019

У меня есть два массива объектов для их объединения. Первый из них является результатом извлечения 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"}

Мне кажется, что оба формата не одинаковы, поэтому в итоге они не объединяются. Так как я могу это сделать, чтобы их можно было объединить?

1 Ответ

0 голосов
/ 04 июля 2019

если я правильно понимаю, вы пытаетесь получить это

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

merge_obj

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