【问题标题】:JSON Object Multiple filterJSON 对象多重过滤器
【发布时间】:2016-07-10 18:51:05
【问题描述】:

我有 JSON 对象,其中数据在从表单中选择元素时进行过滤。 我的表单有以下元素:

Min Age - Max AgeGender - male(1) & female(2)

以下是我的 JSON 对象:

[
   {
      "id":"1",
      "name":"nehil",
      "gender":"1",
      "birthday":"1991-07-22",
      "business_id":"1",
      "timestamp":"2016-03-23 04:46:42",
      "age":"24"
   },
   {
      "id":"2",
      "name":"vartika ",
      "gender":"2",
      "birthday":"1990-08-14",
      "business_id":"1",
      "timestamp":"2016-03-23 04:46:46",
       "age":"25"
   },
   {
      "id":"3",
      "name":"atharva",
      "gender":"1",
      "birthday":"1992-10-10",
      "business_id":"1",
      "timestamp":"2016-03-23 04:46:49",
       "age":"23"
   },
   {
      "id":"4",
      "name":"karan",
      "gender":"1",
      "birthday":"1992-12-22",
      "business_id":"1",
      "timestamp":"2016-03-23 04:46:52",
      "age":"23"
   }
]

Gender 上选择如果是男性,我想要对象中所有男性的id 并将其推送到数组中。 稍后,如果我选择最小年龄为 23 岁,最大年龄为 24 岁,我希望在该数组中更新所有具有以下年龄的男性。

实现这一目标的最佳策略是什么?

以下是我的小提琴链接 - http://jsfiddle.net/Nehil/2ym3ffo0/4/

【问题讨论】:

    标签: javascript jquery arrays json object


    【解决方案1】:

    您可以使用filter

    var arrMale,arrFeMale ; 
    arrMale = geGenderData(1)
    arrFemale = geGenderData(2)
    
    console.log(arrMale)
    console.log(arrFemale)
    
        function geGenderData(intGenderNum){
    
            return data.filter(function(oneObj,key){
    
               return oneObj.gender ==intGender;
            })
    
        }
    

    工作fiddle;

    在最小和最大条件下你可以对年龄做类似的事情

    【讨论】:

    • intGender 在函数中将是 intGenderNum 对吗?
    【解决方案2】:

    如果您不需要搜索多个项目,您可以使用具有特殊结构的对象进行搜索。该提案使用了一个对象,具有这种结构进行过滤:

    { 
        gender: '1',
        age: {
            min: 23, 
            max: 24
        },
        birthday: function (s) { return s.match(/-10-10/); }
    }
    

    算法查找search 中的每个属性,如果所有比较结果为真,则将元素添加到结果集中。

    function filter(array, search) {
        return array.filter(function (a) {
            return Object.keys(search).every(function (k) {
                return (
                    a[k] === search[k] ||
                    typeof search[k] === 'object' && +search[k].min <= a[k] &&  a[k] <= +search[k].max ||
                    typeof search[k] === 'function' && search[k](a[k])
                );
            });
        });
    }
    
    var data = [{ id: "1", name: "nehil", gender: "1", birthday: "1991-07-22", business_id: "1", timestamp: "2016-03-23 04:46:42", age: "24" }, { id: "2", name: "vartika ", gender: "2", birthday: "1990-08-14", business_id: "1", timestamp: "2016-03-23 04:46:46", age: "25" }, { id: "3", name: "atharva", gender: "1", birthday: "1992-10-10", business_id: "1", timestamp: "2016-03-23 04:46:49", age: "23" }, { id: "4", name: "karan", gender: "1", birthday: "1992-12-22", business_id: "1", timestamp: "2016-03-23 04:46:52", age: "23" }];
    
    document.write('<pre>' + JSON.stringify(filter(data, { birthday: function (s) { return s.match(/-10-10/); } }), 0, 4) + '</pre>');
    document.write('<pre>' + JSON.stringify(filter(data, { gender: '2' }), 0, 4) + '</pre>');
    document.write('<pre>' + JSON.stringify(filter(data, { gender: '1', age: { min: 23, max: 24 } }), 0, 4) + '</pre>');

    【讨论】:

    • 如果我想要今天有birthday 的人,那么我如何用今天的日期和月份过滤生日而忽略年份?例如。今天的日期是10-10-2016,我希望今天有生日的人喜欢1992-10-10
    • 您可以扩展对象以接受获取部分结果的函数。
    • 我试图获取生日从'/-04-10/''/-10-10/' 的人的列表,我得到的是空值。更新了我尝试过的小提琴:jsfiddle.net/Nehil/2ym3ffo0/5
    • 你需要一个这样的生日函数:function (s) { return s.match(/\d{4}-(10|0[456789])-10/); }
    • 上述函数只给出 1 个数据集而不是 2 个数据集,如果我尝试给出 7 天的范围,我会得到 null 值。喜欢从/-07-17//-07-23/ 的日期?您可以编辑上面的答案吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多