有没有办法搜索由逗号分隔的jSON属性,并返回不同属性名称的成员ID?

时间:2012-11-26 23:37:57

标签: php javascript mysql json

我希望我能解释这一点;例如,我想要匹配值的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 ,我想获得“1”,因为我的92056的user_id为“1”。

如果是新墨西哥州,我想要“ 9 ”等等。

此值可能包含数百个邮政编码,因此我希望能够快速搜索这些值或 之类的值 ,因为这不会重复;每个user_id将具有多个唯一区域或“值”。

如果出现这种情况,我会使用PHP从数据库中提取数据并传入类似的JavaScript变量(在Wordpress中)......

 <?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);

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')...此函数返回找到的第一个值,但您可以轻松搜索整个列表并附加到结果数组而不是返回。

答案 2 :(得分:0)

你对自己这么做太难了。在将“value”属性发送到浏览器客户端之前将其转换为数组,并在每个值数组上使用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') );