繁体   English   中英

在jQuery或Vanilla JavaScript中过滤JSON数据

[英]Filtering JSON data in jQuery or vanilla JavaScript

我想用jQuery或普通JavaScript过滤JSON对象。 我更喜欢普通的JavaScript,但不知道如何解决。 我已经创建了伪代码来解释我要实现的目标。 有任何想法吗?

我基本上只希望允许不包含列表中值的记录。 第一个列表仅包含应从expJSON中排除的mfs值。 第二个列表包含应从expJSON中排除的pn值,依此类推...

伪代码

var results = $(jsonData).filter(function (i, n) {
        return if list1 is not empty: (n.psn.indexOf(item1 from list1) === -1 || n.psn.indexOf(item2 from list1) === -1 || n.psn.indexOf(item3 from list1) === -1 ... ) &&
        if list2 is not empty: (n.pn.indexOf(item1 from list2) === -1 || n.pn.indexOf(item2 from list2) === -1 || n.pn.indexOf(item3 from list2) === -1 ... ) &&
        if list3 is not empty: (n.mft.indexOf(item1 from list3) === -1 || n.mft.indexOf(item2 from list3) === -1 || n.mft.indexOf(item3 from list3) === -1 ... ) &&
        if list4 is not empty: (n.sl.indexOf(item1 from list4) === -1 || n.sl.indexOf(item2 from list4) === -1 || n.sl.indexOf(item3 from list4) === -1 ... ) &&
        if list5 is not empty: (n.vtv.indexOf(item1 from list5) === -1 || n.vtv.indexOf(item2 from list5) === -1 || n.vtv.indexOf(item3 from list5) === -1 ... )
    })

jsonData

[{"mft": "asjfasdf", "pn": "234awefwa", "vtv": "No", "psn": "234fasdfa", "sl": "asf8sf"}, {"mft": "fsjldfd98sf9d", "pn": "skfjsdf7df", "vtv": "Yes", "psn": "tfs76fdfd", "sl": "basd7f"}, {"mft": "fbsdf8df", "pn": "898723923", "vtv": "No", "psn": "fs7daf6sd", "sl": "f7s6df"}, {"mft": "sdf7688sdf76f", "pn": "131d21", "vtv": "Yes", "psn": "t23yt342y23", "sl": "bfldk34"} ...]

列表1,列表2,列表3,列表4,列表5

              item1     item2    item3
list1/mft = ["word1", "word2", "word3", ...]
list2/pn = ["word1", "word2", "word3", ...]
list3/vtv = ["word1", "word2", "word3", ...]
list4/psn = ["word1", "word2", "word3", ...]
list5/sl = ["word1", "word2", "word3", ...]

如果我正确理解了这个问题,这应该可以为您解决。

// this is based on the jsonData provided
// but I deleted some values cause you said it might not always have a value
var jsonData = [
    {"mft": "asjfasdf", "pn": "234awefwa", "vtv": "", "psn": "234fasdfa", "sl": "asf8sf"},
    {"mft": "fsjldfd98sf9d", "pn": "skfjsdf7df", "vtv": "Yes", "psn": "tfs76fdfd", "sl": "basd7f"},
    {"mft": "", "pn": "898723923", "vtv": "No", "psn": "fs7daf6sd", "sl": "f7s6df"},
    {"mft": "sdf7688sdf76f", "pn": "", "vtv": "Yes", "psn": "t23yt342y23", "sl": "bfldk34"},
    {"mft": "sdf7688sdf76f", "pn": "131d21", "vtv": "Yes", "psn": "t23yt342y23", "sl": ""}]

var keys = ['mft', 'pn', 'vtv', 'psn', 'sl']
var mftList = []
var pnList = []
var vtvList = []
var psnList = []
var slList = []

jsonData.forEach(function(data) {
    keys.forEach(function(key){
       var value = data[key];
       if(!value) {return;}

       switch (key) {
           case 'mft': {
                mftList.push(value)
                break;
           }
           case 'pn': {
                pnList.push(value)
                break;
           }
           case 'vtv': {
                vtvList.push(value)
                break;
           }
           case 'psn': {
                psnList.push(value)
                break;
           }
           case 'sl': {
                slList.push(value)
                break;
           }
        }
    });
});

我猜你的意思是这样的吗?

我只是简单地使用Array.filter来遍历JSON对象中的每个对象。 然后在for循环中为对象中的每个项目提供一个简单的switch语句,以便将它们“过滤”到正确的列表中。


更新! 在进一步审查您的问题以及您在评论中提出的问题之后,我相信您正在寻找的东西类似于以下内容。 我将循环更改为只允许对象返回在给定列表中找不到所述子项的地方。 希望这就是您要寻找的! 祝好运!

 var expJSON = [{"mft": "asjfasdf", "pn": "234awefwa", "vtv": "No", "psn": "234fasdfa", "sl": "asf8sf"}, {"mft": "fsjldfd98sf9d", "pn": "skfjsdf7df", "vtv": "Yes", "psn": "tfs76fdfd", "sl": "basd7f"}, {"mft": "fbsdf8df", "pn": "898723923", "vtv": "No", "psn": "fs7daf6sd", "sl": "f7s6df"}, {"mft": "sdf7688sdf76f", "pn": "131d21", "vtv": "Yes", "psn": "t23yt342y23", "sl": "bfldk34"}]; function filterOutOfMainList(obj, ind, $this) { for (var x in obj) switch(x) { case 'mft': if (list1.indexOf(obj[x]) > -1) return; break; case 'pn': if (list2.indexOf(obj[x]) > -1) return; break; case 'vtv': if (list3.indexOf(obj[x]) > -1) return; break; case 'psn': if (list4.indexOf(obj[x]) > -1) return; break; case 'sl': if (list5.indexOf(obj[x]) > -1) return; break; } return obj; } var list1 = ["example->", "fsjldfd98sf9d"], // mft list2 = ["word1", "word2", "etc"], // pn list3 = ["Yes"], // vtv list4 = ["word1", "word2", "etc"], // psn list5 = ["word1", "word2", "etc"]; // sl console.log(expJSON.filter(filterOutOfMainList)); 
 <h1>Using your JSON as example. Vanilla!</h1> 

因此,这里有一些非常基本且未经过深思熟虑的未优化代码,可以满足您的需求:

function getLists(data){
  var output={}
  var keys = ['mft', 'pn', 'vtv', 'psn', 'sl'];
  for(var i = 0; i < keys.length; i++){
    var current = keys[i];
    output[current] = [];
    for(var j = 0; j < data.length; j++){
      if(data[j][current){
        output[current].push(data[j][current])
      }
    }
  }
  return output;
}

此函数应输出类似{mft:['word1','word2'...],pn:['word1','word2'...] ...}之类的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM