映射减少来自api的json并使用HTML中的Handlebarsjs显示

时间:2018-08-20 03:00:20

标签: javascript jquery handlebars.js

我正在尝试使用手柄片段使以下简单的html正常工作。该示例具有以下

  1. 从外部API获取数据(为简单起见,脚本本身提供了json)

  2. (Map-Reduce)将json中的键值映射并缩小为一个对象(可以直接是json吗?)

  3. 将简化后的对象提供为用于把手编译的数据。

我看到的问题在于正确的映射和车把编译。最后,html应该使用其详细信息渲染两个人。请纠正我,以获得获得结果的优化代码。

我有一个相关的问题,这里的json结构略有变化。 Key-Value Pair Json transformation and conversion into a class in Javascript / Jquery

<html lang="en">

<head>
  <link rel="stylesheet" href="style.css">
  <script src="//code.jquery.com/jquery-2.0.3.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.1.2/handlebars.min.js"></script>
</head>

<body>

  <div id="anchor">This div should append people data dynamically below. if not there is an error</div>

  <script>
    var url = 'data.json';
  </script>
  <!-- 3. Template -->
  <script id="tpl" type="text/template">
    {{#each this}}
    <div><b><a href="{{id}}">Id: {{id}} First Name : {{firstname}} First Name : {{lastName}}</a></b> Gender : {{gender}}, Age : {{age}} Address : {{address}}</div>
    {{/each}}
  </script>
  <!--4. Handlebars.js slingshot -->
  <script>
    //4a.function creation
    var slingshot = function(url, tplId, anchor) {
      $.getJSON(url, function(data) {
        // for simplicity giving the data object below
        data = [{
          "id": "2IJXhq",
          "fields": [{
            "key": "gender",
            "value": "male"
          }, {
            "key": "address",
            "value": "1234, some ln, Los Angeles, CA 9303"
          }, {
            "key": "age",
            "value": "25"
          }],
          "firstName": "David",
          "lastName": "Smith",
          "website": "davidsmith.com"
        }, {
          "id": "3GJXhq",
          "fields": [{
            "key": "gender",
            "value": "male"
          }, {
            "key": "address",
            "value": "1234, some ln, New York, NY 12012"
          }, {
            "key": "age",
            "value": "30"
          }],
          "firstName": "John",
          "lastName": "Crowe",
          "website": "johncrowe.com"
        }]
        //however, please provide a solution after commenting above line to get the json data directly in .getJson(data)
        let o = data.map(item => item
          .reduce((a, {
            key,
            Value
          }) => ({
            [key]: Value,
            ...a
          }), {}))
        var template = $(tplId).html();
        var result = Handlebars.compile(template)(o);
        $(anchor).append(result);
      });
    }
    //4b.function firing
    slingshot('data.json', '#tpl', '#anchor');
  </script>
</body>

</html>

0 个答案:

没有答案