添加snapshot.val&我订阅时,snapshot.key到一个数组

时间:2017-04-28 09:08:32

标签: javascript arrays angular firebase

我会用一块石头打破我的头^^“
我有这段代码:

            this.af.database.list('/Documentos', { preserveSnapshot: true })
            .subscribe(snapshots => {
                snapshots.forEach(snapshot => {
                    console.log(snapshot.key, snapshot.val());
                });
            })

我正确地提取了所有数据,但现在我想添加到一个对象数组或类似的东西(我几周前开始使用Firebase + Angular2)。
我想填充那个数组来加载[ng2 smart table]如果我想用一个格式正确的数组,我会填满表格,但我不知道如何。希望任何人都可以提供帮助。

3 个答案:

答案 0 :(得分:0)

如果您想要一张带有key: value的地图(对象),可以使用Array.prototype.reduce()轻松完成此操作:

const map = snapshots.reduce((map, snapshot) => {
    map[snapshot.key] = snapshot.val();
}, {});

答案 1 :(得分:0)

嗯,根据示例:https://akveo.github.io/ng2-smart-table/#/examples/using-filters ...

(您可以在此处找到源代码:https://github.com/akveo/ng2-smart-table/blob/master/src/app/pages/examples/filter/basic-example-source.component.ts

...您必须将数据放在JSON对象中:

settings = {
  columns: {
    id: {
      title: 'ID',
      filter: false,
    },
    name: {
      title: 'Full Name',
      filter: false,
    },
    username: {
      title: 'User Name',
      filter: false,
    },
    email: {
      title: 'Email',
      filter: false,
    }
  }
};

data = [
  {
    id: 1,
    name: 'Leanne Graham',
    username: 'Bret',
    email: 'Sincere@april.biz',
  },
  {
    id: 2,
    name: 'Ervin Howell',
    username: 'Antonette',
    email: 'Shanna@melissa.tv',
  }
];

“settings”包含您的列名称,“data”必须与“settings”中的列匹配。

如果我们知道你的代码(你的表的列+你的服务返回的数据)会更容易,但我认为这样的东西会起作用:

data = [];
this.af.database.list('/Documentos', { preserveSnapshot: true })
        .subscribe(snapshots => {
            snapshots.forEach(snapshot => {
                data.push(
                    { [snapshot.key]: snapshot.val() }
                );
            });
        })

请注意,这将创建一个JSON数组,每行只有一个键/ val。我们确实需要了解您的数据,以便为您提供一个可靠的答案。

答案 2 :(得分:0)

好的,我找到了一个简单的Array()x)

的解决方案
            this.af.database.list('/Documentos', { preserveSnapshot: true })
            .subscribe(snapshots => {
                snapshots.forEach(snapshot => {
                    let length = todo.documentos.push(snapshot.val()); // documentos is an array in the class
                    todo.source.load(todo.documentos);
                });
            });