【问题标题】:Iterate over Objects in Meteor Blaze迭代 Meteor Blaze 中的对象
【发布时间】:2020-03-29 18:58:26
【问题描述】:

我有一个嵌套对象的数据结构。这是一个具有唯一 id 键的地图。

然后每个键包含另一个映射,该映射由另一组唯一 id 键(_id 对应于 Mongo 文档)组成。这些键中的每一个都包含一个 Mongo 文档。

https://imgur.com/a/EjErAoF 是 Chrome 开发工具中数据结构的示例。

我想在 Blaze 中对其进行迭代。我的目标是有一个显示顶级键(本例中为 1 和 2)的标题……然后对于每个顶级键,有一个表格,其中每一行都是一个嵌套文档。

我了解 Blaze 只能遍历数组和游标,而不能遍历 JS 对象。 https://github.com/meteor/meteor/issues/3884 所以我使用 _.pair 将我的嵌套对象序列化为一个数组,这是我的结果 https://imgur.com/a/bnwzYNk

不过,我无法使用 2D 数组获得我想要的东西。因为现在我的顶级键(本例中为 1 和 2)位于数组的第一个索引处。我不知道如何在 each 中访问它。

简而言之,这是我的全部目标 IE。

{{#each 2dArray}}
    print {{this[0]}}
    <table>
        {{#each this[1]}}
            <tr>{{nestedThis.data}}</tr>
        {{/each}}
   </table>
{{/each}}

有谁知道如何做到这一点,或者还有更好的方法来构建我的数据吗?谢谢

【问题讨论】:

    标签: javascript html mongodb meteor meteor-blaze


    【解决方案1】:

    您应该能够按如下方式重组数据

    input = {
     1: {
       bob001: {_id: "bob001", name: "Bob" },
       jim002: {_id: "jim002", name: "Jim" },
     },
     2: { 
       kim001: {_id: "kim001", name: "Kim" },
       sue002: {_id: "sue002", name: "Sue" },
     }
    }
     
     console.log(input);
     
     output = Object.keys(input).map(key => {
       return {
         key: key,
         data: Object.values(input[key]).map(row => {
           return Object.keys(row).map(k => {
             return {key: k, data: row[k]};
           });
         })
       }
    })
     
    console.log(output);

    在您的组件中,将输入重构为新的ReactiveVar。在$autorun 中执行此操作,假设输入是响应式的(感谢@Jankapunkt):

    Template.my_template.onCreated({
      this.formattedData = new ReactiveVar([]);
      this.$autorun(() => {
        const input = this.input; // get this from somewhere reactive?...
        this.formattedData = Object.keys(input).map(key => {
          return {
            key: key,
            data: Object.values(input[key]).map(row => {
              return Object.keys(row).map(k => {
                return {key: k, data: row[k]};
              });
            })
          }
        })
      })
    })
    

    然后你可以使用blaze显示它:

      {{#each formattedData}}
        print {{key}}
        <table>
          {{#each data}}
            <tr>
            {{#each this}}
              <td>{{key}}: {{data}}</td>
            {{/each}}
            </tr>
          {{/each}}
        </table>
      {{/each}}
    

    【讨论】:

    • 出于性能原因,您应该将Object.keys(input) 计算放在onCreated 中并在那里运行(或者当反应数据发生变化时在this.autorun 跟踪器中运行)并将结果存储在反应变量/字典中.这是因为newArray 将在每次模板更新时运行,并可能导致大量死循环。
    • 感谢@Jankapunkt,我已经改进了我的答案。
    猜你喜欢
    • 2018-06-27
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多