【问题标题】:SearchBar deep search into JSONSearchBar 深度搜索到 JSON
【发布时间】:2017-03-27 18:15:10
【问题描述】:

我在 IONIC 2 中实现了一个搜索栏,它在一个视图中搜索 JSON,以便将其详细信息发送到另一个视图。

我有这个 JSON:

{
  "Alphaville I": { //FIRST KEY
    "ida": [{ //SECOND KEYS
      "hora": "05:40",
      "local": "AV. FERNÃO DIAS PAES LEME (Pref. Várzea Paulista)"
    },... ],
    "volta": [{ //SECOND KEYS
      "hora": "05:40",
      "local": "AV. FERNÃO DIAS PAES LEME (Pref. Várzea Paulista)"
    },... ]
  }, ... //MULTIPLE ITENS
}

因此,在一个视图中,我使用第一个键(如 Alphaville I)创建了一个列表,但我需要搜索其中的 local

但是 Angular 2 *ngFor 需要一个数组,所以我遍历我的对象并将它推送到一个数组,这样做它排除了我的第一个键,所以我现在正在做的(当然没有搜索)正在保存一个数组中的键,获取索引并将jsonResultExample[index] 传递到另一个页面。

我正在使用基本的搜索栏示例,例如 Seachbar Component Docs 中的示例。

所以我需要的是:通过local 键搜索并返回包含输入文本的节点的第一个键(Alphaville I),相同的local 可以出现在其他第一个键中。

我该怎么做?我无法发布更好的代码,因为我没有尝试过任何东西。

有没有更好的方法来为此构建我的 JSON? (顺便说一句,我正在使用 firebase);

欢迎任何帮助或想法,谢谢。

编辑

所以我将第一个键值与idavolta 一起保存,这样我就可以简单地遍历它,获取键值和所有内容而没有很多问题,但是由于我需要按local 过滤它出现在里面idavolta作为另一个数组(因为我有很多这些值),所以它现在看起来像这样:

那么现在我如何访问local?仅使用所有 local 和每个 linha 的键创建另一个对象是否更好,以便我可以返回值?

记住这是 Ionic 2 的搜索栏代码,我的 JSON 有超过 4k 行:

getItems(ev: any) {
  // Reset items back to all of the items
  this.initializeItems();

  // set val to the value of the searchbar
  let val = ev.target.value;

  // if the value is an empty string don't filter the items
  if (val && val.trim() != '') {
    this.items = this.items.filter((item) => {
      return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
    })
  }
}

提前致谢:)

【问题讨论】:

  • 如果我是你,我会创建一个 Map 将本地映射到第一个键列表,假设存在一对多关系。如何创建地图取决于 json 格式的可靠性。您可以编写一个循环遍历对象的每个属性的通用函数。

标签: json angular firebase ionic2


【解决方案1】:

谈到如何设计数据结构的个人经验。因此我不能说跟随方法是最好的方法。

首先,在我们有复杂的数据结构的情况下,我不喜欢在 javascript 中使用 map(又名对象作为数据结构)。主要原因与您所面临的非常相关,无法迭代设计对象。是的,您可以使用Object.keys()Object.values(),但它们太丑了,很难适应所有情况。

将您的第一个密钥作为属性是一个不错的举措。这就涉及到第二个问题。您的结构中似乎有一个假设,一个linha 仅映射到一个local,或者一个local 仅与一个linha 相关。如果是这样,我建议只为linhalocal 关系构建另一个单独的地图。

另一种方法是将您的数据结构规范化为多个单独的 javascript 对象,就像您在数据库上所做的那样。通过这样做,您可以最大限度地提高数据的灵活性,您可以通过Array.prototype.filter()Array.prototype.map() 查询您想要的任何内容,甚至可以通过其索引直接访问。但是,由于您需要管理多个地图,这种方法可能会增加代码行数。

【讨论】:

  • 谢谢。看起来唯一可行的解​​决方案是拥有第二张地图。这在其他情况下也对我有帮助,因为搜索 biiiiiiiiig 对象花了我将近 2 秒,而现在只需要 0.3 秒。所以再次感谢
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多