【问题标题】:Transforming Observable’s output from Object to Array将 Observable 的输出从 Object 转换为 Array
【发布时间】:2019-04-13 03:47:51
【问题描述】:

我有一个 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) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ]

【问题讨论】:

  • 为什么不先创建一个空数组,然后将数组中的每一项推送到“管道”方法中呢?

标签: javascript arrays angular object rxjs


【解决方案1】:

如果数组中项目的顺序无关紧要,你可以使用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);

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2020-08-04
    • 2018-01-31
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多