过滤JSON以仅包含所需的值

时间:2015-07-16 17:50:02

标签: javascript jquery json

我已经在这方面工作了一段时间,我似乎无法弄明白。我有一个JSON,我从链接中提取,我正在尝试创建一个过滤器,以便只显示以某个关键字开头的名称。

我一直在尝试使用.parseJson而且我已经尝试了str.includes(),但我似乎无法正常工作。

这是JSON的一部分:

[
{
    "max_percentile_90th": 42142.1,
    "daily_percentile_50th": 21334.5,
    "timerName": "Booklet:Landscape",
    "sparks": [
        26651,
        23801.2,
        20850.8,
        19157.4,
        21198.5,
    ],
},
{
    "max_percentile_90th": 59253.4,
    "daily_percentile_50th": 9040.5,
    "timerName": "Search:Blog",
    "sparks": [
        9248.1,
        13653,
        8277,
        9532.2,
        10912.4,
    ],
},
{
    "max_percentile_90th": 16707.9,
    "daily_percentile_50th": 3793,
    "timerName": "Search:Records:Download",
    "sparks": [
        6257.6,
        8269,
        9395.4,
        6211.4,
        9420.7,
    ],
},
{
    "max_percentile_90th": 6979.4,
    "daily_percentile_50th": 2821,
    "timerName": "Search:AfterEffects",
    "sparks": [
        3752.2,
        4522.8,
        6167.2,
        3847.9,
        4568.9,
    ],
},
{
    "max_percentile_90th": 5900.8,
    "daily_percentile_50th": 2323,
    "timerName": "Booklet:Geneologies",
    "sparks": [
        3359.2,
        3317.8,
        3113.5,
        2839,
        2675.6,
    ],
}
]

正如你所看到的那样,timerName在其中两个上面带有“Booklet”(但后面有不同的东西),并在其中三个上面以“Search”开头。 JSON要长得多,但这个片段会让我的观点更加突出。所以我想制作一个过滤器,它只显示以“搜索”开头的过滤器或仅显示以“小册子”开头的过滤器。我需要与它相关的所有数据,因为我正在创建一个表,所以有可能基于它创建一个新的JSON吗?或者我应该怎么做呢?

这是我尝试过的小提琴:http://jsfiddle.net/xjcfw7zf/

非常感谢任何帮助!谢谢!!

4 个答案:

答案 0 :(得分:1)

使用.filter().indexOf。过滤器将迭代每个对象并根据条件进行过滤。 indexOf将告诉字符串中是否存在给定的键。

function search(data, key) {
  return data.filter(function(item) {
    return item.timerName.indexOf(key) == 0;
  });
}



var jsonData = [{
  "max90th": 42142.1,
  "daily90th": 21334.5,
  "timerName": "Booklet:Landscape",
  "sparks": [
    26651,
    23801.2,
    20850.8,
    19157.4,
    21198.5,
  ],
}, {
  "max90th": 59253.4,
  "daily90th": 9040.5,
  "timerName": "Search:Blog",
  "sparks": [
    9248.1,
    13653,
    8277,
    9532.2,
    10912.4,
  ],
}, {
  "max90th": 16707.9,
  "daily90th": 3793,
  "timerName": "Search:Records:Download",
  "sparks": [
    6257.6,
    8269,
    9395.4,
    6211.4,
    9420.7,
  ],
}, {
  "max90th": 6979.4,
  "daily90th": 2821,
  "timerName": "Search:AfterEffects",
  "sparks": [
    3752.2,
    4522.8,
    6167.2,
    3847.9,
    4568.9,
  ],
}, {
  "max90th": 5900.8,
  "daily90th": 2323,
  "timerName": "Booklet:Geneologies",
  "sparks": [
    3359.2,
    3317.8,
    3113.5,
    2839,
    2675.6,
  ],
}];

function search(data, key) {
  return data.filter(function(item) {
    return item.timerName.indexOf(key) == 0;
  });
}

alert(search(jsonData, "Booklet").length);
alert(search(jsonData, "Search").length);
alert(search(jsonData, "Something").length);




答案 1 :(得分:1)

过滤以"小册子"开头的对象可以通过以下方式实现

jsonData = jsonData.filter(function(obj){
   return (obj.timerName.indexOf("Booklet") == 0)
});

供参考 - CEN XFS standard

注意 - 为了更通用,您也可以使用变量代替" Booklet"

答案 2 :(得分:0)

使用像lodash这样的库来根据你想要找到的键和值进行过滤,在lodash中你想要使用" pluck"为了你所追求的。 Lodash是一个非常有用的库,它可以让你用JSON对象和javascript来做各种各样的事情。

https://lodash.com/docs#filter

答案 3 :(得分:0)

如何使用for循环遍历JSON对象中的主数组,在当前迭代对象的timerName属性上使用substring进行比较,然后在匹配时将其放入结果数组中,返回那个数组?

/**
 * @param {array}  json
 * @param {string} filter
 */
function itemsByTimerName(json, filter) {
    var filtered = [];

    for (var i = 0; i < json.length; ++i) {
        // if 'timerName' begins with 'filter'
        if (json[i].timerName.substring(0, filter.length) === filter) {
            filtered.push(json[i]);
        }
    }

    return filtered;
}