如何在搜索字符串的子部分时过滤JSON?

时间:2013-03-02 14:52:39

标签: javascript json search filter

我想过滤客户端的JSON对象。在那之前,我用服务器端做了一个:

SELECT * FROM table WHERE row1, row2, row3 LIKE %search%

我想用JSON对象对客户端做同样的事情。

例如,我可以拥有这个JSON对象:

[{'Key1' : 'Value1', 'Key2': 'Value2'}
{'Key3': 'Value3', 'Key4': 'Value4'}]

当我使用过滤器'ue3'时,我希望它返回[{'Key3': 'Value3', 'Key4': 'Value4'}]

3 个答案:

答案 0 :(得分:5)

  

“我想在一个对象数组上进行所有字段搜索,只返回在其中一个字段中包含搜索字符串部分的对象。”

var a = [{'Key1' : 'Value1', 'Key2': 'Value2'},
         {'Key3': 'Value3', 'Key4': 'Value4'}];

var b = filterValuePart(a, "ue3");

function filterValuePart(arr, part) {
    return arr.filter(function(obj) {
        return Object.keys(obj)
                     .some(function(k) { 
                               return obj[k].indexOf(part) !== -1; 
                           });
    });
});

垫片,垫片,垫片


使其不区分大小写:

function filterValuePart(arr, part) {
    part = part.toLowerCase();

    return arr.filter(function(obj) {
        return Object.keys(obj)
                     .some(function(k) { 
                               return obj[k].toLowerCase().indexOf(part) !== -1; 
                           });
    });
});

答案 1 :(得分:1)

假设您有这个JavaScript对象:

var array = [
   {'Key1' : 'Value1', 'Key2': 'Value2'},
   {'Key3': 'Value3', 'Key4': 'Value4'}
];

然后您可以使用

找到属性值包含字符串的对象
var searched = 'ue3';
var matches = array.filter(function(v) {
     for (key in v) {
        if (v[key].indexOf(searched)!=-1) return true;
     }
     return false;
});
var match = matches.length==0 ? null : matches[0];

请注意,IE 8不支持过滤器this MDN article gives a shim

答案 2 :(得分:0)

@Ping - 你可以使用javascript lib DefiantJS(http://defiantjs.com)。有了它,你可以这样做:

var data = [
   {
      "Key1": "Value1",
      "Key2": "Value2"
   },
   {
      "Key3": "Value3",
      "Key4": "Value4"
   }
].
res = JSON.search( data, '//*[contains(., 'ue3')]' );

console.log( res[0].key3 );
// Value3

这是一个工作小提琴:
http://jsfiddle.net/hbi99/s8ZVg/

请注意引用了JSON结构,它应该是JSON。 DefiantJS使用名为“search”的方法和XPath查询(标准化查询语言)扩展全局对象JSON,它返回数组中的匹配项(如果未找到匹配项,则返回空数组)。