2016-09-17 145 views
4

我有以下的JSON字符串:如何過濾JavaScript中的json對象?

{ 
    "Alarm":{ 
     "Hello":48, 
     "World":3, 
     "Orange":1 
    }, 
    "Rapid":{ 
     "Total":746084, 
     "Fake":20970, 
     "Cancel":9985, 
     "Word": 2343 
    }, 
    "Flow":{ 
     "Support":746084, 
     "About":0, 
     "Learn":0 
    } 
} 

然後我打開上面的字符串,並將其轉換爲json對象:

jsonStr = '{"Alarm":{"Hello":48,"World":3,"Orange":1},"Rapid":{"Total":746084,"Fake":20970,"Cancel":9985},"Flow":{"Support":746084,"About":0,"Learn":0}}'; 
var jsonObj = JSON.parse(jsonStr); 

現在,我怎麼過濾由鍵名此json對象?例如如果過濾器是「安吉」,過濾的對象是:

{ 
    "Alarm":{ 
     "Orange":1 
    } 
} 

如果過濾器「FLO」,過濾的對象將變成:

{ 
    "Flow":{ 
     "Support":746084, 
     "About":0, 
     "Learn":0 
    } 
} 

如果過濾器是「窩」 ,結果將是:

{ 
    "Alarm":{ 
     "World":3, 
    }, 
    "Rapid":{ 
     "Word": 2343 
    } 
} 

是否可以使用filter方法實現此篩選?任何意見,將不勝感激。

+1

的可能的複製[篩選JSON數據](http://stackoverflow.com/questions/9483695/filtering-json-data) – Endless

+0

有沒有這樣的東西 「JSON對象」 - JSON是**總是**一個字符串;而已。 – naomik

+0

@naomik你的意思是'JSON.parse(jsonStr)'返回一個字符串? – Meysam

回答

6

可以使用reduce()Object.keys(),將檢查重點名稱以indexOf()並返回所需的結果創建功能。

var obj = { 
 
    "Alarm": { 
 
    "Hello": 48, 
 
    "World": 3, 
 
    "Orange": 1 
 
    }, 
 
    "Rapid": { 
 
    "Total": 746084, 
 
    "Fake": 20970, 
 
    "Cancel": 9985, 
 
    "Word": 2343 
 
    }, 
 
    "Flow": { 
 
    "Support": 746084, 
 
    "About": 0, 
 
    "Learn": 0 
 
    } 
 
} 
 

 
function filterBy(val) { 
 
    var result = Object.keys(obj).reduce(function(r, e) { 
 
    if (e.toLowerCase().indexOf(val) != -1) { 
 
     r[e] = obj[e]; 
 
    } else { 
 
     Object.keys(obj[e]).forEach(function(k) { 
 
     if (k.toLowerCase().indexOf(val) != -1) { 
 
      var object = {} 
 
      object[k] = obj[e][k]; 
 
      r[e] = object; 
 
     } 
 
     }) 
 
    } 
 
    return r; 
 
    }, {}) 
 
    return result; 
 
} 
 

 
console.log(filterBy('ange')) 
 
console.log(filterBy('flo')) 
 
console.log(filterBy('wor'))

+0

嗨,您的代碼中存在一個錯誤,我無法修復。你可以看看嗎? https://jsfiddle.net/1tmwkkza/2/在示例代碼中,如果搜索「is」,則只返回「IsHello」並忽略「IsWorld」。 – Meysam

+0

好吧現在嘗試它,我認爲它的固定https:// jsfiddle。net/1tmwkkza/6/ –

+0

固定,謝謝:) – Meysam

2

filter方法我想你的意思是Array#filter函數。這不適用於對象。反正你輸入數據的解決方案看起來是這樣的:

function filterObjects(objects, filter) { 
    filter = filter.toLowerCase(); 
    var filtered = {}; 
    var keys = Object.keys(objects); 
    for (var i = 0; i < keys.length; i++) { 
     var key = keys[i]; 
     if (objects.hasOwnProperty(key) === true) { 
      var object = objects[key]; 
      var objectAsString = JSON.stringify(object).toLowerCase(); 
      if (key.toLowerCase().indexOf(filter) > -1 || objectAsString.indexOf(filter) > -1) { 
       filtered[key] = object; 
      } 
     } 
    } 
    return filtered; 
} 
+1

您可以跳過'if(objects.hasOwnProperty(key)=== true)'中的'=== true''。 –

11

除了給定的解決方案,你可以使用遞歸式的檢查鑰匙。

該建議提供了在其中嵌入更多嵌套對象並僅獲取過濾部件的機會。

function filterBy(val) { 
 
    function iter(o, r) { 
 
     return Object.keys(o).reduce(function (b, k) { 
 
      var temp = {}; 
 
      if (k.toLowerCase().indexOf(val.toLowerCase()) !== -1) { 
 
       r[k] = o[k]; 
 
       return true; 
 
      } 
 
      if (o[k] !== null && typeof o[k] === 'object' && iter(o[k], temp)) { 
 
       r[k] = temp; 
 
       return true; 
 
      } 
 
      return b; 
 
     }, false); 
 
    } 
 

 
    var result = {}; 
 
    iter(obj, result); 
 
    return result; 
 
} 
 

 
var obj = { Alarm: { Hello: 48, "World": 3, Orange: 1 }, Rapid: { Total: 746084, Fake: 20970, Cancel: 9985, Word: 2343 }, Flow: { Support: 746084, About: 0, Learn: 0 }, test: { test1: { test2: { world: 42 } } } }; 
 

 
console.log(filterBy('ange')); 
 
console.log(filterBy('flo')); 
 
console.log(filterBy('wor'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

更大的靈活性的解決方案,謝謝! – Meysam