2013-03-02 39 views
-1

我想过滤客户端的JSON对象。在那之前我做了服务器端有:如何在搜索字符串的子部分时过滤JSON?

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

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

例如,我可以有此JSON对象:

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

当我使用过滤器“虚幻引擎3”我想它返回[{'Key3': 'Value3', 'Key4': 'Value4'}]

+0

您的对象是一个JavaScript对象,而不是JSON对象,因为没有像JSON对象那样的东西。 [JSON](http://json.org)是一种数据交换格式。 – 2013-03-02 14:56:11

+1

您的JSON无效。即使您打算发布JavaScript对象文字语法,您也会错过逗号。请发布代表您正在使用的实际代码/数据的有效代码。 – 2013-03-02 14:59:29

+0

搜索的逻辑是什么?这似乎并不合理。你想看看你的字符串的任何属性值吗? – 2013-03-02 14:59:32

回答

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

它的工作原理,非常感谢!我的问题不是很清楚......我必须看看它为什么起作用。 – Lukmo 2013-03-02 15:08:28

+0

@Ping:查看MDN并阅读['Object.keys'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys),['.filter ()'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter)和['.some()'](https://developer.mozilla。组织/ EN-US /文档/ JavaScript的/参考/ Global_Objects /阵列/一些)。 – 2013-03-02 15:10:21

+0

我在检查他们,谢谢。任何想法如何使功能不区分大小写? – Lukmo 2013-03-02 15:12:12

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

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,它返回数组中的匹配(如果没有找到匹配,则返回空数组)。