代码之家  ›  专栏  ›  技术社区  ›  Dango

使用关键字搜索JSON结果集并仅返回匹配项

  •  0
  • Dango  · 技术社区  · 10 年前

    我试图搜索下面的Yodlee JSON数据源,例如,如果关键字是“furniture”,则只显示“plainTextDescription”,该值等于“furnity transactions”

    不太确定如何使用JQuery在嵌套的JSON结果集之间进行grep。。。

    ///原始YODLEE JSON结果集

    http://pastebin.com/6498mZJf

    提前感谢!

    2 回复  |  直到 10 年前
        1
  •  1
  •   m.casey    10 年前

    这是 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>');
        }
    })();
    

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

        2
  •  0
  •   Community CDub    7 年前

    您可以通过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;