【问题标题】:How do I filter Json data using a attribute in node.js如何使用 node.js 中的属性过滤 Json 数据
【发布时间】:2016-10-27 18:49:21
【问题描述】:

我有一个看起来像

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

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

        }
    ],

}

有没有办法我可以通过“value”过滤这个:“true”,所以只有 values ,其中 value =true ,然后我想要一个 say ==Hello 的计数。非常感谢您的帮助,JavaScript 世界的新手

【问题讨论】:

标签: javascript node.js lodash


【解决方案1】:
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;

【讨论】:

  • ["1258820b-guid"] 实际上是一个 guid,每次都会因不同的事情而改变。我如何在这里使用通用值?
  • 添加了基于现有属性'value'和'say'检测和提取源数组的功能。
【解决方案2】:

您可以使用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);

【讨论】:

  • ["1258820b-guid"] 实际上是一个 guid,每次都会因不同的事情而改变。如何在这里使用通用值?
  • 它有一个共同的模式,还是你需要过滤所有属性?
  • 我需要按所有属性过滤
【解决方案3】:

类似:

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 中处理该对象还是接下来要对其进行序列化。

【讨论】:

    【解决方案4】:

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

    这里是Official website Underscorejs 供进一步阅读。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2019-04-17
      • 2018-10-30
      • 1970-01-01
      相关资源
      最近更新 更多