簡體   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