繁体   English   中英

如何使用node.js中的属性过滤Json数据

[英]How do I filter Json data using a attribute in node.js

我有看起来像的JSON对象

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

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

        }
    ],

}

有没有一种方法可以通过“ value”:“ true”对此进行过滤,所以只能有values,其中value = true,然后我要说一个== Hello。 非常感谢您的帮助,这是javascript世界的新手

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;

您可以只使用Array#filter检查属性。

 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); 

就像是:

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;
}

应该管用。 另一个解决方案是JSON解析对象,然后仅使用o.value作为保留对象的测试,这取决于您打算继续在JS中处理该对象还是在下一步对其进行序列化。

我建议使用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"});

这是Underscorejs 官方网站,供您进一步阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM