如何使用指定的文本/字符NOT键值获取json值

时间:2017-09-27 05:00:49

标签: javascript jquery json jsonpath

我有一个奇怪的要求是通过值从JSON对象获取值,例如在下面的json对象中,如果我将值传递为 Steve 而不是像 Steve Jon ,如何循环整个json对象并在整个json对象中找到匹配的对象。 我的json对象非常大,请建议我循环整个对象而不会破坏性能的任何好方法。我已经检查了JSONPath表达式,但它没有工作

提前致谢

grouped_people: {
    'friends': [
        {name: 'Steve Jon', country: 'NZ'},
        {name: 'Jane Ken', country: 'US'},
        {name: 'Mike Jhon', country: 'AU'},
        {name: 'Mary Mani', country: 'NZ'},
    ],
    'enemies': [
        {name: 'Evil Steve', country: 'AU'},
        {name: 'Betty', country: 'NZ'},
    ]
}

3 个答案:

答案 0 :(得分:0)

您可以使用recursive功能查找包含给定值的object,如下所示。



var grouped_people = {
  'friends': [{
      name: 'Steve Jon',
      country: 'NZ'
    },
    {
      name: 'Jane Ken',
      country: 'US'
    },
    {
      name: 'Mike Jhon',
      country: 'AU'
    },
    {
      name: 'Mary Mani',
      country: 'NZ'
    },
  ],
  'enemies': [{
      name: 'Evil steve',
      country: 'AU'
    },
    {
      name: 'Betty',
      country: 'NZ'
    },
  ]
};

//Recursive function to search text in the object
function findObject(obj, text, callback) {
  for (var k in obj) {
    if (typeof obj[k] == "object" && obj[k] !== null) {
      findObject(obj[k], text, callback);
    } else {
      if (obj[k].toLowerCase().indexOf(text.toLowerCase()) !== -1) {
        callback(obj);            
      }
    }
  }
}


findObject(grouped_people, "Steve", function(obj) {
  //All matched objects will return here.
  console.log(obj);
});




答案 1 :(得分:0)

我认为打击功能(来自Google的Angular项目)可能对您有帮助:

/* Seach in Object */

var comparator = function(obj, text) {
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
    for (var objKey in obj) {
        if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
                comparator(obj[objKey], text[objKey])) {
            return true;
        }
    }
    return false;
}
text = ('' + text).toLowerCase();
return ('' + obj).toLowerCase().indexOf(text) > -1;
};

var search = function(obj, text) {
if (typeof text == 'string' && text.charAt(0) === '!') {
    return !search(obj, text.substr(1));
}
switch (typeof obj) {
    case "boolean":
    case "number":
    case "string":
        return comparator(obj, text);
    case "object":
        switch (typeof text) {
            case "object":
                return comparator(obj, text);
            default:
                for (var objKey in obj) {
                    if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
                        return true;
                    }
                }
                break;
        }
        return false;
    case "array":
        for (var i = 0; i < obj.length; i++) {
            if (search(obj[i], text)) {
                return true;
            }
        }
        return false;
    default:
        return false;
}
};

请参阅this post

答案 2 :(得分:0)

根据您的对象,您可以执行以下操作:

for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
  for (var subKey in obj[key]) {        
    if(obj[key][subKey].name.toLowerCase().search(keyword)!=-1){
        alert('The keyword exist')
        return true;
    }
  }       

  }
    alert('not found');
    return false;   
}

我假设您通过表单传递关键字,例如您可以将其传递给下面的方法:

<input type="text" id="keyword" placeholder="Enter Keyword" />
<input type="button" onclick="find(keyword.value)" value="find" />

我在这里为你做了一个例子(不区分大小写的搜索更新):

https://jsfiddle.net/emilvr/9o8s2680/2/