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

时间:2017-03-31 08:52:47

标签: javascript json

我试图过滤掉所有不包含5个数组值的记录:ssn,spn,smft,ssl,svtv。输出不正确,因为它仅适用于列表包含1个元素的情况。输出数组包含多个元素时变为空。我试图获取不包含每个列表(OR)中的一个值的记录。我认为它不起作用,因为它检查每个记录是否不包含每个列表中的所有值(AND)。知道如何解决这个问题吗?

jsonData

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

查询

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

代码

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
        })
    })
}

3 个答案:

答案 0 :(得分:2)

您可以将every用于AND,将some用于OR。在您的情况下,您希望通过键列表(everyAND),然后检查搜索数组中是否存在该值。 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);
    });
  });
}




编辑以涵盖一些边缘案例。

答案 1 :(得分:0)

我会将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;
}

答案 2 :(得分:0)

这样的事情应该有效

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;
  });
}

但是,不清楚是否要匹配完整的键和值对,或者只是一个值,而不管它的键是什么。以上只有在键和值匹配时才有效。