【问题标题】:Searching in a JSON object with generated query string使用生成的查询字符串在 JSON 对象中搜索
【发布时间】:2016-06-06 20:23:28
【问题描述】:

我正在尝试使用 Lo-Dash 在 Angular JS 中搜索 JSON 对象。这里的挑战是我的 JSON 结构会动态变化。因此,我的搜索查询字符串也必须更改。

我的 JSON 格式为:

    {       
            "SERIES": "ABC000123123",
            "SECTOR": "E",
            "INDUSTRY": "N31",
            "DURATION": "1A"    }, 

   {        "SERIES": "ABC000123456",
            "SECTOR": "E",
            "INDUSTRY": "N11",
            "DURATION": "12"    }, 

   {        "SERIES": "ABC000456789",
            "SECTOR": "E",
            "INDUSTRY": "N31",
            "DURATION": "1B"    }

我的 JSON 也可以是以下格式:

{       
            "SERIES": "DEF000321",
            "AREA": "C2",
            "ITEM": "123"    },
{       
            "SERIES": "DEF000321",
            "AREA": "D0",
            "ITEM": "675"    },

AREA、ITEM、SECTOR、INDUSTRY 等键会有所不同。

在上述所有情况下,只有 SERIES 字段保持不变。 我需要传入其余属性的键、值对来检索 SERIES 值。

为简单起见,我使用 lodash 搜索上述 JSON 的方法如下:

_.map(_.filter(JSON_Object, function (value) { 
return (value.AREA == D0) && (value.ITEM == C2) }), 'SERIES');

我在哪里以编程方式生成以下字符串:

(value.AREA == 'D0') && (value.ITEM == 'C2')

这种方法行不通。 当我对这些值进行硬编码时,它工作正常。当我以编程方式生成查询字符串时,不是相反。

我尝试遍历列表并一次过滤掉一个属性,但这会增加循环次数和搜索的复杂性。

有什么建议/解决方法吗?提前致谢

编辑:添加控制台截图: enter image description here

【问题讨论】:

    标签: angularjs json lodash


    【解决方案1】:

    试试这个方法:https://fiddle.jshell.net/koljada/53esaqLz/1/

    var JSON_Object = [{
      "SERIES": "ABC000123123",
      "SECTOR": "E",
      "INDUSTRY": "N31",
      "DURATION": "1A"
    }, {
      "SERIES": "ABC000123456",
      "SECTOR": "E",
      "INDUSTRY": "N11",
      "DURATION": "12"
    }, {
      "SERIES": "ABC000456789",
      "SECTOR": "E",
      "INDUSTRY": "N31",
      "DURATION": "1B"
    }];
    
    var query = "(value.SECTOR == 'E') && (value.INDUSTRY == 'N11')";
    
    var result = _(JSON_Object)
      .filter(new Function("value", "return " + query))
      .map('SERIES')
      .value(); // => ["ABC000123456"]
    

    【讨论】:

    • 当我使用相同的函数时,我不断得到一个空数组。你能解释一下符号'var result = _(JSON_Object) .filter(new Function("value", "return " + query))'
    • new Function("value", "return " + query) 将转换为function(value) { return (value.SECTOR == 'E') && (value.INDUSTRY == 'N11'); }。因此,在此之后,它可以用作 lodash 过滤器中的谓词。如您所见,它适用于我的小提琴。所以要小心你的查询!
    • 如果你不喜欢链式表示法,你可以使用这个:_.map(_.filter(JSON_Object, new Function("value", "return " + query)),'SERIES');
    • 代替 JSON_Object,我传递了一个包含我所有 JSON 的 $scope 变量。它是否有可能无法读取 JSON 并因此给我一个空数组?我在 web 控制台调试,有没有更好的方法?
    • 你的 $scope 变量是一个数组吗?因为 _.filter 不适用于对象。你能提供你的查询和完整的 JSON_Object 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多