0

我希望我能正确解释这一点;例如,我想要匹配值的 user_id: id : 在返回的 jSON Array/Object 中,像这样......

[{"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,我想得到"1",因为我的 92056 的 user_id 是 "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并非所有浏览器都完全支持它,因此您需要包含一个 polyfill 或实现您自己的“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

您更喜欢在服务器端还是客户端进行搜索?页面是否需要进行多次搜索?如果没有,服务器端可能会稍微快一些,因为通过网络发送的数据会更少。

假设客户端(并且没有加载库),这是一种可能的解决方案:

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"));​

关于您的示例数据需要注意的一点:多个用户 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 回答