【问题标题】:how to search nested level JSON array如何搜索嵌套级别的 JSON 数组
【发布时间】:2020-06-10 13:50:39
【问题描述】:

我有一个具有 JSON 格式结构的 API,我需要更深入地搜索数组的第三级。我正在使用,但它不起作用,所以我要搜索一个库来做我需要有人告诉我去 Loadash 库,他说它将实现我正在寻找的东西。我在路上实现了 with 但没有工作,所以我需要知道我的代码有什么问题。

编辑

我更新了我的问题并添加了 HTML 代码来向您展示我需要什么,因为您的答案没有给我我所期望的。

<temlate>
  <div>
    <div class="col-lg-6">
         <input type="email"
                class="form-control-in"
                id="exampleInputEmail1"
                aria-describedby="emailHelp"
                placeholder="search"
                v-model="search">
     </div>

    <div class="page-output" v-for="(asset, i) in doFilter" :key="i">
         <target-body :asset="asset"
                :search_by="search_by"></target-body>
    </div>
  </div>
</template>



domainAssets = 
[
   {
      "id":122,
      "name":"Game",
      "web_technologies":[
         {
            "name":"RequireJS",
            "categories":[
               "JavaScript Frameworks"
            ]
         }
      ]
   },
   {
      "id":123,
      "name":"Game2",
      "web_technologies":[
         {
            "name":"Composer",
            "categories":[
               "PHP Frameworks"
            ]
         }
      ]
   }
]

我正在使用vuejs进行搜索:

//...
data(){
   return {
      search_by: 'web_technologies',
      search: 'PHP',
   }
},

computed: {
  ...mapState({
      domainAssets: state => state.Domain.domainAssets
  }),
  
  doFilter(){
    let self = this;
    return this.domainAssets.filter(function(domain){
      if(self.search_by == "web_technologies"){
         return _.includes(_.get(domain.web_technologies, self.search_by), self.search.toLowerCase());
      }
    }
  }
//..

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    可以使用标准数组方法来完成。查找其中一个 web_technologies 对象的类别包含目标字符串的对象...

    let searchBy = 'web_technologies'
    
    function findDataWithCategory(category, data) {
      return data.find(datum => {
        return datum[searchBy].some(wt => {
          let searchableCategories = wt.categories.map(c => c.toLowerCase())
          return searchableCategories.some(cat => cat.includes(category.toLowerCase()))
        })
      })
    }
    
    const data = [{
        "id": 122,
        "name": "Game",
        "web_technologies": [{
          "name": "RequireJS",
          "categories": [
            "JavaScript Frameworks"
          ]
        }]
      },
      {
        "id": 123,
        "name": "Game2",
        "web_technologies": [{
          "name": "Composer",
          "categories": [
            "PHP Frameworks"
          ]
        }]
      }
    ]
    
    console.log(findDataWithCategory('pHp', data))

    EDIT 已改进以允许不区分大小写的搜索。一种可能更好的方法(留给读者)是在收到数据时提前向数据添加一个 searchableCategories 属性,只需一次。再次编辑以检查子字符串并具有变量“searchBy”键。

    【讨论】:

    • 嗨,@danh 感谢您的反馈,我按照您的指示进行操作,但这并没有使我达到目标,我觉得您的答案接近我的解决方案。
    • @Omda - 您是否按下了“运行代码 sn-p”按钮?它产生的结果符合我对您问题的理解。
    • @danh- yah 它工作正常,但是当我将它与我的代码一起使用并使用计算属性时它不起作用!
    • @Omda - 我只是 Vue 的涉猎者,但这个答案似乎比你的设置更简单。你能改变这个简单的设置,看看会发生什么吗? stackoverflow.com/a/41791604/294949
    【解决方案2】:

    您可以使用 lodash,但您的参数不正确。首先对于_.get,您应该只给出根元素,然后给出子元素的路径。接下来,因为您正在寻找项目的一部分,我将使用 join 将列表转换为字符串。最后添加一个||,以便您检查正常情况,您正在搜索'PHP'.toLowerCase(),即使在字符串中也不起作用

    return domainAssets.filter(function(domain){
      if((self.search_by == "web_technologies"){
         return _.includes(_.get(domain, 'web_technologies[0].categories').join(), search.toLowerCase()) || _.includes(_.get(domain, 'web_technologies[0].categories').join(), search);
      }
    })
    

    【讨论】:

    • 谢谢@deppem 为我的问题做出贡献,我也跟着你解决了,但是当输入字段更改时没有任何反应,那么我怎样才能将其作为计算属性然后在我的组件上使用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2023-02-08
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多