2016-10-27 10 views
0

に属性を使用してJSONデータをフィルタリングしない私はどのように私はNode.jsの

{ 
    "1F54716": [], 
    "1258820b-guid": [ 
     { 
      "value": "true", 
      "property": "", 
      "say": "Hello", 

     }, 
     { 
      "value": "false", 
      "property": "", 
      "say": "Hello", 

     } 
    ], 

} 

のように見えるJSONオブジェクトを持っていることは、私は、「値」で、これをフィルタリングすることができる方法があります:「真」、これだけ持っています値は、ここで値=真、そして、私は言う==こんにちはの数が欲しい。本当にあなただけのプロパティのチェックをArray#filterを使用することができますjavascriptの世界に新しい

+0

http://stackoverflow.com/questions/36749119/how-to-filter-json-string-array-based-on-attributesこれはJSONではありません。この – garima

+0

を参照してください。 –

答えて

2
var theObject = {"1F54716": [], "1258820b-guid": [ 
    {"value": "true", "property": "", "say": "Hello"}, 
    {"value": "false", "property": "", "say": "Hello"}, 
    {"value": "true", "property": "", "say": "Bye"}, 
    {"value": "true", "property": "", "say": "Hello"} 
]}; // Array has 3 value "true" objects and 2 of them count as say "Hello". 

function extractArrayWithValueAndSay(obj) { 
    for (var k in obj) { 
     if (obj[k] && obj[k].length && "value" in obj[k][0] && "say" in obj[k][0]) { 
      return obj[k]; 
     } 
    } 
    return []; 
} 

var sourceArray = extractArrayWithValueAndSay(theObject); 

var filteredValueTrueArray = sourceArray.filter(function (obj) { 
    return obj && obj.value == "true"; 
}); 

var filteredSayHelloCount = filteredValueTrueArray.filter(function (obj) { 
    return obj && obj.say == "Hello"; 
}).length; 
+0

によってフィルタリングする必要がある[「1258820b-GUID」]は、実際のGUIDであり、異なるものを毎回変更されます。ここでは一般的な値をどのように使用しますか? – user1110790

+0

既存のプロパティ 'value'と 'say'に基づいてソース配列を検出および抽出する関数を追加しました。 –

0

、あなたの助けに感謝。

function filterObj(obj) { 
    let res = {}; 
    let res.count = 0; 
    // iterate through all keys in the object 
    Object.keys(obj).forEach(k => { 
    // if this sub-object has 
    res[k] = obj[k].filter(o => { 
    // if say = hello increment our counter by 1. Otherwise it stays the same 
    res.count += o.say === 'hello' ? 1 : 0; 
    // if the object has value === true, keep it in our final results 
    return o.value === "true"; 
    }); 
); 
    // res.count is the number of say === 'hello' 
    // and res contains only objects with value === 'true' 
    return res; 
} 

動作するはずです:ような何かが

var data = { "1F54716": [], "1258820b-guid": [ { "value": "true", "property": "", "say": "Hello", }, { "value": "false", "property": "", "say": "Hello", } ], }, 
 
    count; 
 

 
// filter all properties 
 
Object.keys(data).forEach(function (k) { 
 
    data[k] = data[k].filter(function (a) { 
 
     return a.value === "true"; 
 
    }); 
 
}); 
 

 
// count 
 
count = Object.keys(data).reduce(function (r, k) { 
 
    return data[k].reduce(function (rr, a) { 
 
     return rr + +(a.say === 'Hello'); 
 
    }, r); 
 
}, 0); 
 

 
console.log(data); 
 
console.log(count);

+0

[「1258820b-GUIDが」]、実際にGUIDであり、異なるものを毎回変更されます。ここでは一般的な値をどのように使用しますか? – user1110790

+0

それが一般的なパターンを持っていないか、すべてのプロパティは、フィルタリングが必要ですか? –

+0

は私がすべてのプロパティ – user1110790

0

。 JSONオブジェクトを解析し、ちょうどあなたがJSでこのオブジェクトの処理を続行することを計画したり、次のことをシリアル化しているかどうかに応じて、それを維持するためにテストとしてo.value使用するために別の解決策は次のようになります。

0

私はUnderscore.jsフレームワークを使用してお勧めしたいです。これは、JavaScript配列にデータを検索するための様々な方法を提供します。

var obj = { 
"1F54716": [], 
"1258820b-guid": [ 
    { 
     "value": "true", 
     "property": "", 
     "say": "Hello", 

    }, 
    { 
     "value": "false", 
     "property": "", 
     "say": "Hello", 

    } 
], 
} 
var result = _.where(obj["1258820b-guid"], { value : "true"}); 

ここでは、furthurの読みにはOfficial website Underscorejsです。