【问题标题】:How can I filter JSON when searching for a sub part of a string?搜索字符串的子部分时如何过滤 JSON?
【发布时间】:2013-02-17 00:28:21
【问题描述】:

我想在客户端过滤一个 JSON 对象。在那之前,我在服务器端做了一个:

SELECT * FROM table WHERE row1, row2, row3 LIKE %search%

我想用 JSON 对象在客户端做同样的事情。

例如,我可以拥有这个 JSON 对象:

[{'Key1' : 'Value1', 'Key2': 'Value2'}
{'Key3': 'Value3', 'Key4': 'Value4'}]

当我使用过滤器“ue3”时,我希望它返回[{'Key3': 'Value3', 'Key4': 'Value4'}]

【问题讨论】:

  • You 对象是 JavaScript 对象,而不是 JSON 对象,因为没有 JSON 对象之类的东西。 JSON是一种数据交换格式。
  • 您的 JSON 无效。即使您打算发布 JavaScript 对象文字语法,您也会缺少逗号。请发布代表您正在使用的实际代码/数据的有效代码。
  • 您的搜索逻辑是什么?这似乎并没有真正的意义。您想查看字符串的任何属性值吗?
  • 你的场景很奇怪:第一条记录的键/列与第二条不同??
  • 我想对一个对象数组进行所有字段搜索,并且只返回在其中一个字段中包含部分搜索字符串的对象。

标签: javascript json search filter


【解决方案1】:

假设你有这个 JavaScript 对象:

var array = [
   {'Key1' : 'Value1', 'Key2': 'Value2'},
   {'Key3': 'Value3', 'Key4': 'Value4'}
];

然后你可以找到属性值包含字符串的对象

var searched = 'ue3';
var matches = array.filter(function(v) {
     for (key in v) {
        if (v[key].indexOf(searched)!=-1) return true;
     }
     return false;
});
var match = matches.length==0 ? null : matches[0];

请注意,IE 8 不支持过滤器但this MDN article gives a shim。

【讨论】:

    【解决方案2】:

    “我想对一个对象数组进行所有字段搜索,并且只返回在其中一个字段中包含部分搜索字符串的对象。”

    var a = [{'Key1' : 'Value1', 'Key2': 'Value2'},
             {'Key3': 'Value3', 'Key4': 'Value4'}];
    
    var b = filterValuePart(a, "ue3");
    

    function filterValuePart(arr, part) {
        return arr.filter(function(obj) {
            return Object.keys(obj)
                         .some(function(k) { 
                                   return obj[k].indexOf(part) !== -1; 
                               });
        });
    });
    

    垫片,垫片,垫片


    使其不区分大小写:

    function filterValuePart(arr, part) {
        part = part.toLowerCase();
    
        return arr.filter(function(obj) {
            return Object.keys(obj)
                         .some(function(k) { 
                                   return obj[k].toLowerCase().indexOf(part) !== -1; 
                               });
        });
    });
    

    【讨论】:

    • 它有效,非常感谢!我的问题不太清楚......不过我得看看它为什么会起作用。
    • @Ping:查看 MDN,阅读有关 Object.keys、.filter() 和 .some() 的信息。
    • 我正在检查它们,谢谢。任何想法如何使函数不区分大小写?
    • @Ping:是的,通过在两个值上调用 .toLowerCase() 来规范化大小写。所以对于函数的第一行添加part = part.toLowerCase(),然后在最里面的return语句中,添加return obj[k].toLowerCase().indexOf(part) !== -1;。为了清楚起见,我将在这些更改中添加一个不区分大小写的函数。
    【解决方案3】:

    @Ping - 你可以使用 JavaScript 库 DefiantJS (http://defiantjs.com)。有了它,你可以做这样的事情:

    var data = [
       {
          "Key1": "Value1",
          "Key2": "Value2"
       },
       {
          "Key3": "Value3",
          "Key4": "Value4"
       }
    ].
    res = JSON.search( data, '//*[contains(., 'ue3')]' );
    
    console.log( res[0].key3 );
    // Value3
    

    这是一个有效的小提琴:
    http://jsfiddle.net/hbi99/s8ZVg/

    请注意,JSON 结构被引用,这是 JSON 应该的。 DefiantJS 使用称为“搜索”的方法和 XPath 查询(这是一种标准化的查询语言)扩展了全局对象 JSON,它返回数组中的匹配项(如果未找到匹配项,则返回空数组)。

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2021-06-28
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2012-08-16
      • 2013-06-27
      • 2020-11-26
      • 1970-01-01
      相关资源
      最近更新 更多