Javascript在JSON对象中搜索

ram*_*esh 35 javascript jquery json jsonp

我的应用程序中有一个JSON字符串/对象.

{"list": [
    {"name":"my Name","id":12,"type":"car owner"},
    {"name":"my Name2","id":13,"type":"car owner2"},
    {"name":"my Name4","id":14,"type":"car owner3"},
    {"name":"my Name4","id":15,"type":"car owner5"}
]}
Run Code Online (Sandbox Code Playgroud)

我的应用程序中有一个过滤器框,当我在该框中键入一个名称时,我们必须过滤该对象并显示结果.

例如,如果用户输入"name"并点击搜索,那么我们必须在JSON对象中搜索全名并返回数组,就像MySQL搜索一样......

我的问题是用字符串过滤json对象并返回数组....

T.J*_*der 36

如果你的问题是,是否有一些内置的东西可以搜索你,那么不,没有.您基本上使用任一String#indexOf正则表达式来遍历数组以测试字符串.

对于循环,您至少有三个选择:

  1. 一个无聊的旧for循环.

  2. 启用ES5的环境(或垫片)Array#filter.

  3. 因为你正在使用jQuery jQuery.map.

无聊的旧for循环示例:

function search(source, name) {
    var results = [];
    var index;
    var entry;

    name = name.toUpperCase();
    for (index = 0; index < source.length; ++index) {
        entry = source[index];
        if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {
            results.push(entry);
        }
    }

    return results;
}
Run Code Online (Sandbox Code Playgroud)

你在那里用obj.listas source和所需的名称片段称为name.

或者,如果有空白条目或没有名称的条目,请更改if为:

        if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {
Run Code Online (Sandbox Code Playgroud)

Array#filter 例:

function search(source, name) {
    var results;

    name = name.toUpperCase();
    results = source.filter(function(entry) {
        return entry.name.toUpperCase().indexOf(name) !== -1;
    });
    return results;
}
Run Code Online (Sandbox Code Playgroud)

再次,如果有任何机会存在空白条目(例如,undefined与缺少相反; filter将跳过缺少的条目),将内部返回更改为:

        return entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1;
Run Code Online (Sandbox Code Playgroud)

jQuery.map示例(这里我假设jQuery= $通常是这种情况; 如果您正在使用,则更$改为):jQuerynoConflict

function search(source, name) {
    var results;

    name = name.toUpperCase();
    results = $.map(source, function(entry) {
        var match = entry.name.toUpperCase().indexOf(name) !== -1;
        return match ? entry : null;
    });
    return results;
}
Run Code Online (Sandbox Code Playgroud)

(entry && entry.name &&如有必要,再加上那里.)


McG*_*gle 36

你可以循环遍历数组并找到匹配项:

var results = [];
var searchField = "name";
var searchVal = "my Name";
for (var i=0 ; i < obj.list.length ; i++)
{
    if (obj.list[i][searchField] == searchVal) {
        results.push(obj.list[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ana*_*ngh 12

您可以简单地将数据保存在一个变量中,然后使用 JavaScript 的 find(获取单个记录对象)或 filter(获取单个记录数组)方法。

例如 :-

let data = {
 "list": [
   {"name":"my Name","id":12,"type":"car owner"},
   {"name":"my Name2","id":13,"type":"car owner2"},
   {"name":"my Name4","id":14,"type":"car owner3"},
   {"name":"my Name4","id":15,"type":"car owner5"}
]}
Run Code Online (Sandbox Code Playgroud)

现在使用下面的命令 onkeyup 或输入

获取单个对象

data.list.find( record => record.name === "my Name")
Run Code Online (Sandbox Code Playgroud)

获取单个数组对象

data.list.filter( record => record.name === "my Name")
Run Code Online (Sandbox Code Playgroud)