【问题标题】:Searching JSON resultset using keywords and return only matches使用关键字搜索 JSON 结果集并仅返回匹配项
【发布时间】:2014-09-01 04:01:17
【问题描述】:

我正在尝试搜索下面的 Yodlee JSON 数据源,例如,如果关键字是“家具”,那么只显示等于“家具交易”的“plainTextDescription”

不太清楚如何使用 JQuery 对嵌套的 JSON 结果集进行 grep...

///原始 YODLEE JSON 结果集

http://pastebin.com/6498mZJf

提前致谢!

【问题讨论】:

  • 为什么不将其转换为 Javascript 对象并使用 .indexOf() 进行搜索?
  • @m.casey 你能提供一个简单的代码示例吗?
  • 我在下面添加了一个答案。

标签: javascript jquery json search yodlee


【解决方案1】:

您可以通过 JQuery 非常轻松地完成此操作。

this question 的已接受答案中,已经编写了一个简单的方法来为您执行此操作。它对 JSON 对象进行深度搜索,然后将所有匹配的对象输出到一个数组中。获取此数组的长度将为您提供所需的出现次数。

    function getObjects(obj, key, val) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getObjects(obj[i], key, val));
            } else if (i == key && obj[key] == val) {
                objects.push(obj);
            }
        }
        return objects;
    }
    //put in the desired object name for ObjectName
    //if the object is a string just use JSON.parse(ObjectName) to convert it to a javascript object
    getObjects(ObjectName, "furnitire", "Furniture Transactions").length;

【讨论】:

    【解决方案2】:

    这是Fiddle

    简短的版本是这样的:

    var data = JSON.stringify({ "Body": [{...my obscenely long JSON}] });
    var parsedData = JSON.parse(data);
    var transactions = [];
    
    // processes account objects
    function processAccount(account) {
        if (account.cardTransactions) {
            for (var i = 0; i < account.cardTransactions.length; i++) {
                var transaction = account.cardTransactions[i];
                if (transaction) {
                    if (transaction.categorizationKeyword.toLowerCase() === 'shell oil') {
                        transactions.push(transaction);
                    }
                }
            }
        }
    }
    
    // processes the itemData objects
    function processItemData(itemData) {
        for (var i = 0; i < itemData.accounts.length; i++) {
            processAccount(itemData.accounts[i]);
        }
    }
    
    (function() {
        // iterates through elements in the body
        for (var i = 0; i < parsedData.Body.length; i++) {
            processItemData(parsedData.Body[i].itemData);
        }
    
        for (var j = 0; j < transactions.length; j++) {
            $('#container').append('<p>' + transactions[j].plainTextDescription + '</p>');
        }
    })();
    

    为了便于阅读,我将这些位分解为多个函数,但可以将其重新分解为不那么冗长。

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2014-12-16
      • 2020-04-29
      • 2015-01-31
      相关资源
      最近更新 更多