0

私がこれを正しく説明していることを願っています。例として、一致する値の user_id: id : が返された jSON 配列/オブジェクトに次のように...

[{"user_id":"1","value":"92056,92054,92018"},{"user_id":"3","value":"92056"},
{"user_id":"2","value":"Massachusetts, Wyoming, Tennessee"},
{"user_id":"5","value":"California"},
{"user_id":"9","value":"New Mexico, Mississippi, Washington"},
{"user_id":"11","value":"Nevada"},{"user_id":"8","value":"Oklahoma, Louisiana"},
{"user_id":"6","value":"Montana, Oregon"},
{"user_id":"10","value":"Virginia, Illinois"}]

たとえば、ソースが92056の場合、92056 の user_id が「1」であるため、 「1」を取得します。

ニューメキシコなら「9」とか。

この値は数百の郵便番号で構成されている可能性があるため、これらの値または同様の値を迅速に検索する方法が必要です。これは重複しないためです。各 user_id には、複数の一意の地域または「値」があります。

これが発生した場合に備えて、PHP を使用してデータベースからデータを取得し、(Wordpress で) JavaScript 変数に渡します...

 <?php
        global $wpdb;
        $fullPHP = $wpdb->get_results("SELECT user_id, value FROM " . "refer_cimy_uef_data;");
 ?>
        var phpreps = JSON.stringify(<?php echo json_encode($fullPHP); ?>);
        $("#phpoutput").html(phpreps);
4

3 に答える 3

1

これはあなたが望むことをしているようです?:

http://jsfiddle.net/WVqFr/1/

var input = [{"user_id":"1","value":"92056,92054,92018"},{"user_id":"3","value":"92056"},
{"user_id":"2","value":"Massachusetts, Wyoming, Tennessee"},
{"user_id":"5","value":"Massachusetts, Wyoming, California, Tennessee"},
{"user_id":"9","value":"New Mexico, Mississippi, Washington"},
{"user_id":"11","value":"Nevada"},{"user_id":"8","value":"Oklahoma, Louisiana"},
{"user_id":"6","value":"Montana, Oregon"},
{"user_id":"10","value":"Virginia, Illinois"}];

function searcher(value) {
    for (var item in input) {
        var obj = input[item];
        var val_arr = obj["value"].split(",");
        for (var i = 0; i < val_arr.length; i++) {
            var cur = val_arr[i].trim();
            if (value == cur) {
                return obj["user_id"];
            }
        }
    }
}

alert(searcher("New Mexico"));

ただし、元の入力が指定した形式であると仮定しています。別の形式の入力を使用すると、検索が簡単または高速になる場合がありますが、それはあなた次第です。すべてのブラウザで完全にサポートされているわけで.trimはないため、ポリフィルを含めるか、独自のタイプの「トリム」を実装する必要があります。「、」で分割するのが最も安全であるという理由だけでトリミングしますが、一部の配列にスペースを残すことができますが、他の配列には残しません。コンマの後の文字列にスペースがないことがわかっている場合は、そのtrim部分を無視できます。スペースの違いに注意してください"92056,92054,92018""New Mexico, Mississippi, Washington"

また、 を使用する必要がない場合はtrim、内側のforループを削除して、 を使用if (val_arr.indexOf(value) > -1) { return obj["user_id"]; }して、検索している項目が分割配列に含まれているかどうかを確認できます。ただし、古い IE バージョンではサポートされていないことを知っておいてください。Array.indexOf

于 2012-11-26T23:49:17.583 に答える
0

サーバー側とクライアント側のどちらで検索を行いますか?ページは複数の検索を行う必要がありますか?そうでない場合は、ネットワークを介して送信されるデータが少なくなるため、サーバー側の方がわずかに高速になる可能性があります。

クライアント側(およびライブラリがロードされていない)を想定すると、考えられる解決策の1つは次のとおりです。

var json = [
    {"user_id":"1","value":"92056,92054,92018"},{"user_id":"3","value":"92056"},
    {"user_id":"2","value":"Massachusetts, Wyoming, Tennessee"},
    {"user_id":"5","value":"Massachusetts, Wyoming, California, Tennessee"},
    {"user_id":"9","value":"New Mexico, Mississippi, Washington"},
    {"user_id":"11","value":"Nevada"},{"user_id":"8","value":"Oklahoma, Louisiana"},
    {"user_id":"6","value":"Montana, Oregon"},
    {"user_id":"10","value":"Virginia, Illinois"}
];

function search(needle) {
    var reg = new RegExp('\\b'+needle+'\\b');
    for (var i = 0; i < json.length; i++) {
        if (json[i]['value'].match(reg)) {
            return json[i]["user_id"];
        }
    }
}

alert(search("New Mexico"));​

サンプルデータについて注意すべき点が1つあります。複数のユーザーIDにいくつかの値が表示されます(例:「Tennessee」)...この関数は最初に見つかった値を返しますが、リスト全体を簡単に検索して、代わりに結果配列に追加できます。戻る。

于 2012-11-27T00:10:55.873 に答える
0

あなたは自分自身にこれをあまりにも難しくしています。ブラウザ クライアントに送信する前に「値」プロパティを配列に変換し、各値配列で indexOf を使用して、検索クエリが存在するかどうかを確認します。次のコードでは、下部の検索機能は非常に単純です。最初の部分は、値のプロパティを適切な配列に変換するためのクライアント側の変換コードです。

//pre-process the data to put 'value' into an array. This would be better done from the server in the initial response.

var input = (function(){

    var arr = [
        {"user_id":"1","value":"92056,92054,92018"},{"user_id":"3","value":"92056"}, 
        {"user_id":"2","value":"Massachusetts, Wyoming, Tennessee"},
        {"user_id":"5","value":"California"},
        {"user_id":"9","value":"New Mexico, Mississippi, Washington"},
        {"user_id":"11","value":"Nevada"},
        {"user_id":"8","value":"Oklahoma, Louisiana"},
        {"user_id":"6","value":"Montana, Oregon"},
        {"user_id":"10","value":"Virginia, Illinois"}
    ];

    arr.forEach(function(item, index){ //remove extra space from some splitting
        arr[index].value = arr[index].value.replace(/,\s/gi,',').split(',');
    });

    return arr;

})();


var search = function(val){

    for(var i=0, len=input.length; i<len; i++){

        if( input[i].value.indexOf(val) > -1 ) return input[i].user_id;

    }

    return null;

}

console.log( search('New Mexico') );
于 2012-11-27T01:07:00.817 に答える