我希望我能解释这一点;例如,我想要匹配值的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);
答案 0 :(得分: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') );