2016-12-28 10 views
1

Я использую Object.assign, чтобы добавить атрибут к каждому элементу массива наблюдаемогоИспользование Object.assign с наблюдаемым массивом

Борясь выяснить правильные операторы, чтобы добавить атрибут к каждому объекту массива. Например, в этом случае поле имени использовалось неправильно для оценки.

Пример:

let x = Observable.of({id: 1, name: first grader}, {id: 2, name: second grader}) 

// current solution using flatmap and then re-configuring as array 
x 
.flatMap(res => res.map(student => Object.assign({}, student, {grade: student.name}))) 
.toArray() 

Приведенный выше пример работает, но кажется странным ... а я flatmapping, а затем повторно составляющих массив. Есть ли лучший оператор/подход для сокращения этапов?

Если я просто использую Object.assign на начальном наблюдаемом, я получаю: Объект {0: Объект, 1: Объект}, который является объектом объектов, а не массивом объектов.

ответ

1

Приведенный выше пример работает, но кажется странным ... а я flatmapping и затем повторно -конфигурирование массива. Есть ли лучший оператор/подход , чтобы уменьшить шаги?

Если данные уже доступны как массив, то вы можете мутировать весь массив себя:

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 
    .map(students => { 
    // note - this map below is Array.prototype.map, not Rx 
    return students.map(student => Object.assign({}, student, {grade: student.name})); 
    }) 
    .subscribe(x => console.log(x)); 

Но Rx действительно сияет, когда ваши данные получил асинхр:

Rx.Observable.from([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) /* stream of future student data elements */ 
    .map(student => Object.assign({}, student, {grade: student.name})) 
    .toArray() // combine your complete stream when completed into a single array emission 
    .subscribe(x => console.log(x)); 

toArray() - это функция утилиты для ожидания завершения, а затем возвращает все испускаемые элементы внутри массива в качестве первого (и окончательного) излучения.

1

Если вы запустите свой code, так как он сработает. Потому что, если вы передадите несколько объектов на Observable.of, он будет толкать их в поток один за другим.

Так я предполагаю, что вы имели в виду это

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 

примечание квадратные скобки.

Чтобы достичь того, чего вы хотите, вы можете использовать map оператор:

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 
     .map(res => res.map(student => Object.assign({}, student, {grade: student.name}))) 
     .subscribe(x => console.log(x)); 

См jsBin

Смежные вопросы