49

アプリケーションに 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"}
]}

アプリケーションにフィルター ボックスがあり、そのボックスに名前を入力すると、オブジェクトをフィルター処理して結果を表示する必要があります。

たとえば、ユーザーが「名前」と入力して検索をヒットした場合、JSON オブジェクトでフル ネームを検索し、MySQL 検索のように配列を返す必要があります ...

私の質問は、json オブジェクトを文字列でフィルタリングし、配列を返すことです....

4

8 に答える 8

53

配列をループして、一致するものを見つけることができます。

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]);
    }
}
于 2012-05-21T04:49:32.857 に答える
45

あなたの質問が、あなたのために検索を行う組み込みのものがあるかどうかである場合、いいえ、ありません。基本的に、String#indexOfまたは正規表現を使用して配列をループし、文字列をテストします。

ループには、少なくとも 3 つの選択肢があります。

  1. 退屈な古いforループ。

  2. ES5 対応環境 (または shim を使用) では、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;
}

as でそれを呼び出し、目的の名前フラグメントをobj.listasで呼び出す場所。sourcename

または、空白のエントリまたは名前のないエントリがある可能性がある場合は、次のように変更ifします。

        if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {

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;
}

また、空白のエントリがある可能性がある場合 (たとえば、undefined不足ではなく、不足しているfilterエントリをスキップします)、内部の戻り値を次のように変更します。

        return entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1;

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;
}

(また、必要に応じてそこに追加entry && entry.name &&します。)

于 2012-05-21T04:48:47.867 に答える
2

javascript を使用した SQL ライクなデータベースであるPaulGuojSQLを使用します。例えば:

var db = new jSQL();
db.create('dbname', testListData).use('dbname');
var data = db.select('*').where(function(o) {
    return o.name == 'Jacking';
}).listAll();
于 2012-05-21T05:12:56.810 に答える
2

JSON で動作するように正規表現を調整しました。

まず、JSON オブジェクトを文字列化します。次に、一致した部分文字列の開始と長さを保存する必要があります。例えば:

"matched".search("ch") // yields 3

JSON 文字列の場合、これはまったく同じように機能します (カンマと中かっこを明示的に検索しない限り、正規表現を実行する前に JSON オブジェクトを事前に変換することをお勧めします (つまり、:, {, } と考えてください))。

次に、JSON オブジェクトを再構築する必要があります。私が作成したアルゴリズムは、マッチ インデックスから再帰的にさかのぼって JSON 構文を検出することでこれを行います。たとえば、擬似コードは次のようになります。

find the next key preceding the match index, call this theKey
then find the number of all occurrences of this key preceding theKey, call this theNumber
using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times
return this object called parentChain

この情報を使用して、正規表現を使用して JSON オブジェクトをフィルタリングし、キー、値、および親オブジェクト チェーンを返すことができます。

私が作成したライブラリとコードは、http://json.spiritway.co/で確認できます。

于 2015-03-27T19:36:52.007 に答える