简体   繁体   English

如何基于JavaScript中的多个条件过滤JSON数据?

[英]How to filter JSON data based on multiple criteria in JavaScript?

I am trying to filter out all records that don't contain values from the 5 arrays: ssn, spn, smft, ssl, svtv. 我试图从5个数组中过滤掉所有不包含值的记录:ssn,spn,smft,ssl,svtv。 The output is not correct because it only works in cases where the lists contain 1 element. 输出不正确,因为它仅在列表包含1个元素的情况下才有效。 The output array becomes empty when they contain multiple elements. 当它们包含多个元素时,输出数组将为空。 I am trying to get records that don't contain one of the values from each list (OR). 我试图获取不包含每个列表(OR)中的值之一的记录。 I think it doesn't work because it checks if each record doesn't contain all values in each list (AND). 我认为这行不通,因为它会检查每个记录是否不包含每个列表(AND)中的所有值。 Any idea how to fix this? 任何想法如何解决这个问题?

jsonData jsonData

[{"sn": "234234234", "pn": "1014143", "mft": "hello world", "sl": "GG07", "vtv": "Yes"},{"sn": "324234234", "pn": "101423131143", "mft": "hello world 1", "sl": "GG08", "vtv": "Yes"}]

query 询问

ssn: ['T234834U', 'T23423423'],
spn: ['1014114', '21412342'],
smft: ['Sbasdfa', 'asdfaser'],
ssl: ['BB03', 'SFD04'],
svtv: ['Yes']

Code

function getFiltered() {    
    var query = {
        sn: ssn, 
        pn: spn,
        mft: smft,
        sl: ssl,
        vtv: svtv
    }    
    var filtered = find_in_object(jsonData, query)
}

function find_in_object(my_object, my_criteria) {
    return my_object.filter(function(obj) {
        return Object.keys(my_criteria).every(function(c) {
            return JSON.stringify(obj[c]).indexOf(my_criteria[c]) === -1
        })
    })
}

You can use every for AND and some for OR . 您可以将every用于AND并将some用于OR In your case you want to go thru the list of keys (so every for AND ) and then check if the value exists in the search array. 在您的情况下,您要遍历键列表(因此, every键用于AND ),然后检查搜索数组中是否存在该值。 indexOf should do the job: indexOf应该做的工作:

 let jsonData = [ {"sn": "234234234", "pn": "1014143", "mft": "hello world", "sl": "GG07", "vtv": "Yes"}, {"sn": "324234234", "pn": "101423131143", "mft": "hello world 1", "sl": "GG08", "vtv": "Yes"} ] let query = { mft: [], sl: ["GG08"], vtv: ["No"] } console.log(find_in_object(jsonData, query)); //returns one let query2 = { sn: ['T234834U', 'T23423423'], pn: ['1014114', '21412342'], mft: ['Sbasdfa', 'asdfaser'], sl: ['BB03', 'SFD04'], vtv: ['Yes'] } console.log(find_in_object(jsonData, query2)); //returns none function find_in_object(my_array, my_criteria) { return my_array.filter(function(obj) { return Object.keys(my_criteria).every(function(key) { return (Array.isArray(my_criteria[key]) && (my_criteria[key].some(function(criteria) { return (typeof obj[key] === 'string' && obj[key].indexOf(criteria) === -1) })) || my_criteria[key].length === 0); }); }); } 

Edited to cover some edge cases. 编辑以涵盖一些边缘情况。

I would turn the json object in an array and then make a simple string comparison to each key. 我将把json对象放在一个数组中,然后对每个键进行简单的字符串比较。

$(document).ready(function() {
    var data = [{"mft": "hello world", "pn": "1014143", "vtv": "Yes", "pn": "T1323F2342", "sl": "GG07"},{"mft": "hello 1", "pn": "234234", "vtv": "Yes", "pn": "T252345234", "sl": "SDF87"}];


    filterData(data[0]);
});


function filterData(data) {
    var newArray = [];
     for (var key in data) {
        var value   = data[key];
        console.log(key, value);

        if (key==="ssn" || key==="spn" || key==="smft"|| key==="ssl"|| key==="svtv") {
            var object  = {key:value};
            newArray.push(object)
        }
    }
    return newArray;
}

Something like this should work 这样的事情应该工作

function find_in_object(data, query) {
  return data.filter(function(record) { 
    for(var i in record) {
      if(query[i] && query[i].indexOf(record[i]) !== -1) {
        return false;
      }
    }
    return true;
  });
}

However it is not clear whether you want to match a complete key and value pair, or just a single value regardless of it's key. 但是,不清楚是要匹配完整的键和值对,还是只匹配一个键(无论键是什么)。 The above will only work if the key AND the value match. 仅当键和值匹配时,以上内容才有效。

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

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