2013-03-02 67 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,它返回數組中的匹配(如果沒有找到匹配,則返回空數組)。