将Observable的输出从对象转换为数组

时间:2019-04-13 03:47:51

标签: javascript arrays angular object rxjs

我有一个Cloud Firestore文档,该文档应该是对象数组。看起来像这样

docname: {
  0: {...}
  1: {...}
  2: {...}

这是预料之中的,因为我这样填充了该文档

myDocRef.set( {...user.myArray});

我遇到的问题是当我从文档中检索数据时。 我目前是这样做的

getUserItems(uid) {
  return this._db.doc<MyObj>(`users/${uid}/mysubcollection/items`).valueChanges(); 
}

这将返回一个对象对象,我需要将其作为对象数组,以便可以在其上使用forEach()

我尝试使用map()运算符,但是它给了我一些我不理解的结果。

所以,我的目标是将对象的对象转换为对象的数组,我尝试了

items$.pipe(
      tap(item => console.log('before map', item )),
      map(item => [item]),
      tap(item => console.log('after map', item ))
    )
    .subscribe(...);

之所以可以做这样的工作,是因为它将对象的对象转换为对象的数组,但是当然,它会将所有对象都放在两个昏暗的数组的第一个昏暗的地方,

Array [Object(9)]

在这里我该怎么做才能将对象的对象转换为对象的数组,以便最终结果是这样的

Array(9) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ]

从这里开始

Object(9) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ]

对此

Array(9) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ]

1 个答案:

答案 0 :(得分:2)

如果数组中各项的顺序无关紧要,则可以使用Object.values

const objectOfObjects = {
  0: { name: "Zero" },
  1: { name: "One" },
  2: { name: "Two" },
  3: { name: "Three" }
};
const unorderedArray = Object.values(objectOfObjects);
console.log(unorderedArray);

如果它们确实很重要,请首先使用Object.entries获取键和值,然后按升序对其进行排序,然后map取出值:

const objectOfObjects = {
  0: { name: "Zero" },
  1: { name: "One" },
  2: { name: "Two" },
  3: { name: "Three" }
};
const orderedArray = Object.entries(objectOfObjects).sort(([a], [b]) => a - b).map(([, obj ]) => obj);
console.log(orderedArray);