【问题标题】:Filter JSON file on load?在加载时过滤 JSON 文件?
【发布时间】:2018-08-01 01:16:21
【问题描述】:

我有想要根据用户选择过滤的 json 数据。出于某种原因,我在调试器控制台中收到一条错误消息:TypeError: obj.contacts.filter is not a function。这是我的代码示例:

var contactStorage = {};
$("#frm_find").on("submit", findContacts);

function findContacts(e) {
  e.preventDefault();
  var frmFilter = $("#frm_filterby").val();

  if (frmFilter) {
    $.ajax({
      type: "GET",
      url: "https://api.myjson.com/bins/9j7qg?" + new Date().getTime(),
      dataType: "json"
    }).done(function(obj) {
      contactStorage = obj.contacts.filter(function(entry) {
        switch (frmFilter) {
          case '1':
            return entry.status === 1;
            break;
          case '2':
            return entry.status === 0;
            break;
          default:
            return entry;
        }
      });
      console.log(contactStorage);
    }).fail(function(jqXHR, textStatus, errorThrown) {
      alert('Error: ' + errorThrown);
    });
  }
}
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<form name="frm_find" id="frm_find" autocomplete="off">
  <div class="row find-row">
    <div class="form-group col-xs-12 col-sm-12 col-md-3 col-md-offset-2 col-lg-3 col-lg-offset-2">
      <select class="form-control" name="frm_filterby" id="frm_filterby" required>
        <option value="">--Choose--</option>
        <option value="1">Active</option>
        <option value="2">Inactive</option>
        <option value="3">Show All</option>
      </select>
    </div>
    <div class="form-group col-xs-12 col-sm-12 col-md-3 col-md-offset-2 col-lg-3 col-lg-offset-2">
      <button class="btn btn-block btn-primary" name="frm_search" id="frm_search">
                                        <span class="glyphicon glyphicon-search"></span> Search
                                    </button>
    </div>
  </div>
</form>

如果有人知道如何解决此问题,请告诉我。谢谢。

【问题讨论】:

  • 这意味着 obj.contacts 不是 数组 - 查看响应,它不是数组

标签: javascript json filter


【解决方案1】:

contacts 是一个对象,而不是一个数组:

contacts:{1: {id: 1, first: "Mike", last: "Johnson", email: "mjohnson@gmail.com", phone: "(203) 567-9055",…},…}

要使用filter,首先将其转换为数组,可能通过Object.values

var contactStorage = {};
$("#frm_find").on("submit", findContacts);

function findContacts(e) {
  e.preventDefault();
  var frmFilter = $("#frm_filterby").val();

  if (frmFilter) {
    $.ajax({
      type: "GET",
      url: "https://api.myjson.com/bins/9j7qg?" + new Date().getTime(),
      dataType: "json"
    }).done(function(obj) {
      contactStorage = Object.values(obj.contacts).filter(function(entry) {
        switch (frmFilter) {
          case '1':
            return entry.status === 1;
            break;
          case '2':
            return entry.status === 0;
            break;
          default:
            return entry;
        }
      });
      console.log(contactStorage);
    }).fail(function(jqXHR, textStatus, errorThrown) {
      alert('Error: ' + errorThrown);
    });
  }
}
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<form name="frm_find" id="frm_find" autocomplete="off">
  <div class="row find-row">
    <div class="form-group col-xs-12 col-sm-12 col-md-3 col-md-offset-2 col-lg-3 col-lg-offset-2">
      <select class="form-control" name="frm_filterby" id="frm_filterby" required>
        <option value="">--Choose--</option>
        <option value="1">Active</option>
        <option value="2">Inactive</option>
        <option value="3">Show All</option>
      </select>
    </div>
    <div class="form-group col-xs-12 col-sm-12 col-md-3 col-md-offset-2 col-lg-3 col-lg-offset-2">
      <button class="btn btn-block btn-primary" name="frm_search" id="frm_search">
                                        <span class="glyphicon glyphicon-search"></span> Search
                                    </button>
    </div>
  </div>
</form>

如果你想将过滤后的数组转换回某种对象,你可以传播它:

contactStorage = { ...contactStorage};

【讨论】:

  • 感谢您的回答。还有一个问题,如您所见,我使用 JS 对象在加载后存储 JSON 数据。问题是它将在数组中设置数据。记录更新、添加或删除后,我必须将该数据以相同格式上传回 JSON 文件。有什么好的方法可以实现吗?
  • 您是否需要上传 数据或只是更改/获取具有您的脚本可以访问的所需内容的变量?这是两个非常不同的概念。如果要上传数据,可以使用fetch
  • 我必须提取数据并显示给用户。然后,如果用户想要添加/编辑/删除数据,我必须以相同的结构将数据上传回。那有意义吗?截至目前,我将 json 数据保存在 JS 对象中,但这会将数据转换为数组。所以我在以相同格式将 json 数据上传回 API 时遇到问题。您能否提供一些如何实现的示例?
  • 这完全超出了您最初提出的问题 - 如果您有新问题,您应该 ask a new question
  • 实际上您提出的解决方案将 obj.contacts 数据转换为数组,这就是问题所在。我不希望将对象转换为数组。相反,我想过滤一个对象并保持原样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多