如何获取对象数组而不是数组数组

时间:2019-02-01 15:56:18

标签: javascript arrays rxjs

我正在尝试进行一些映射以得出对象数组。

类似这样的事情: enter image description here

但是我从下面的方法中得到的是一个数组数组 enter image description here

this.service.getItems(this.id).pipe(
      switchMap(arr => {
        const userObservables = 
        arr.map(collects => this.afs.collection(`users`,
           (ref) => ref.where('someId', '==', collects.id)).valueChanges()
           .pipe(first())
        );
        return combineLatest(...userObservables)
            .pipe(
              map((...eusers) => {
                console.log(eusers[0]) //Should be array of objects
                arr.forEach((collect, index) => {
                  collect['username'] =  eusers[0][index]['displayName']['username'];
                  collect['first_name'] =  eusers[0][index]['displayName']['first_name'];
                  collect['last_name'] =  eusers[0][index]['displayName']['last_name'];
                  collect['avatar'] = eusers[0][index]['photoURL'];
              });
              console.log(arr)
              return arr;
            })
            );
      })
    )
    .subscribe(obj => console.log(obj));

我应该如何重写它以获得我想要的结果(对象数组)?

2 个答案:

答案 0 :(得分:1)

JavaScript

  

concat()方法用于合并两个或多个数组。这个方法   不会更改现有数组,而是返回一个新数组。

const array = [['1', '2'],['1'],['1','2','3']];
const newArray = [].concat.apply([], array);

对于这种行为,Lodash和Underscore也很棒而且更干净:

Lodash

https://lodash.com/docs/#flatten

  

Flattens数组深达一个级别。

_.flatten([1, [2, [3, [4]], 5]]);
// => [1, 2, [3, [4]], 5]

我在 Angular 项目中使用了 lodash ,它非常易于使用。

import * as _ from 'lodash'; 

let x = _.flatten(array.items);

npm软件包:https://www.npmjs.com/package/lodash

下划线(JS)

https://underscorejs.org/#flatten

  

展开嵌套数组(嵌套可以达到任何深度)。如果通过   浅时,该数组将仅被展平一个级别。

_.flatten([1, [2], [3, [[4]]]]);
// => [1, 2, 3, 4];

_.flatten([1, [2], [3, [[4]]]], true);
// => [1, 2, 3, [[4]]];

npm软件包:https://www.npmjs.com/package/underscore

答案 1 :(得分:0)

您可以为每个样式循环使用一个简单的函数,将所有内容推入新数组。

const input = [[1], [1], [1]];
const output = [];

input.forEach(arr => arr.forEach(elem => output.push(elem)));