如何使用指定的 text/characters NOT 键值获取 json 值

How do I fetch json values with specified text/characters NOT key value

我有一个奇怪的要求,要按值从 JSON 对象中获取值,例如在下面的 json 对象中,如果我将值作为 Steve 而不是像 Steve Jon 这样的完整值,我如何循环我的整个 json 对象并在整个 [=22= 中找到匹配的对象] 目的。 我的 json 对象非常大,请建议我在不影响性能的情况下循环整个对象的任何好方法。我检查了 JSON 路径表达式,但它不起作用

提前致谢

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 函数来查找包含给定值的 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);
});

我认为 blow 函数(来自 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

根据您的对象,您可以这样做:

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/