【问题标题】:Filtering nested JSON javascript过滤嵌套的 JSON javascript
【发布时间】:2015-02-17 06:05:08
【问题描述】:

我正在创建一个采用这样的 JSON 的 API:

 "hightlights":[
  {
     "title":"Fun",
     "url":"fun/index.html",
     "queries":
     [
        "music",
        "artists",
        "events",
        "internet"
     ]
  },
  {
     "title":"Internet",
     "url":"internet/index.html",
     "queries":
     [
        "javascript",
        "web",
        "internet",
     ]
  }
 ] 

我需要使用用户给出的单词过滤 JSON,然后返回另一个 JSON,其中只有包含“查询”中的单词的对象。

 If word === 'music', receive:
 {
     "title":"Fun",
     "url":"fun/index.html",
     "queries":[
        "music",
        "artists",
        "events",
        "internet"
     ]
 }

 If word === 'internet', receive:
 {
     {
     "title":"Fun",
     "url":"fun/index.html",
     "queries":[
        "music",
        "artists",
        "events",
        "internet"
     ]
  },
  {
     "title":"Internet",
     "url":"internet/index.html",
     "queries":[
        "javascript",
        "web",
        "internet",
     ]
  }

我的问题是如何嵌套这些值?如果有人可以给我一些例子...我会很感激...

【问题讨论】:

  • “如何嵌套这个值”是什么意思?
  • 如何过滤内部查询并返回所有包含这个词的对象?
  • 如果我需要过滤部分字符串如“mus”,我该怎么做?

标签: javascript json api filter


【解决方案1】:

试试下面的:

function getResult(filterBy, objList) {
  return objList.hightlights.filter(function(obj) {
   return obj.queries.some(function(item){
     return item.indexOf(filterBy) >= 0;
   });
 });
}

输入#1:

getResult("internet", yourObject);

输出 #1:

[{"title":"Fun","url":"fun/index.html","queries":["music","artists","events","internet"]},{"title":"Internet","url":"internet/index.html","queries":["javascript","web","internet"]}]

输入#2:

getResult("music", yourObject);

输出#2:

[{"title":"Fun","url":"fun/index.html","queries":["music","artists","events","internet"]}]

【讨论】:

  • 嗨@kelsadita,这行得通,但只要使用完整的字符串,我想输入“mus”并且也可以......我该怎么做?
  • 嗨,kelsadita,效果很好!!! =) 但是让我再问一件事……如果 JSON 不在 utf-8 中,带有“Política”之类的词,我该如何更改为 utf-8 并进行比较? =x
【解决方案2】:
var search = function(data, query) {
    return data.hightlights.filter(function(highlight) {
        return highlight.queries.indexOf(query) > -1;
    });
}

search(data, "music");

如果您有可用的curry 函数(如RamdaLo-Dash 等),您可以将其包装起来:

var search = curry(function(data, query) { ... });

然后你可以通过先传入数据来创建更简单的函数:

highlights = search(data);
//...
highlights("music"); //=> those containing "music"
highlights("internet"); //=> those containing "internet"

更新

我知道已经有一个可行的解决方案。但这可能会简单一些。

这将在查询中搜索子词:

var search = function(data, query) {
    return data.hightlights.filter(function(highlight) {
        return highlight.queries.filter(function(q) {
            return q.indexOf(query) > -1;
        }).length > 0;
    });
}

【讨论】:

  • 这不是和5分钟前的回答很相似吗?
  • 嗨@scott-sauyet,这可行,但只要使用完整的字符串,我想输入“mus”并且也可以......我该怎么做?
  • @Thrustmaster,是的,我在编写/编辑它时进来了。如果这个没有柯里化的建议,我会直接删除它。
【解决方案3】:
var xyz = {
   "hightlights":[
      {
         "title":"Fun",
         "url":"fun/index.html",
         "queries":[
            "music",
            "artists",
            "events",
            "internet"
         ]
      },
      {
         "title":"Internet",
         "url":"internet/index.html",
         "queries":[
            "javascript",
            "web",
            "internet",
         ]
      }
   ]
}

不让说“var word”包含要搜索的关键字,那么你可以简单地这样做:

var arr = [];
for(var i in xyz['highlights']){
        var queries = xyz['highlights']['queries'];
        for(j in queries){
              if (word == queries[j]){
                       arr.push(xyz['highlights'][i]);
                       continue;
              }
        }
}

arr 应该有你需要的对象。抱歉,这是非常基本的。但希望它有所帮助。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2014-07-12
    • 1970-01-01
    • 2019-06-25
    • 2020-08-25
    • 2019-05-23
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多