[英]Dynamic Programming: return all match data
I have written a simple dynamic program which can return first matched data. 我编写了一个简单的动态程序,可以返回第一个匹配的数据。 Now I want to get all matched data.
现在,我想获取所有匹配的数据。 My data :
我的资料:
let countryList = {
country: [{
name: "Bangladesh",
province: [{
name:"Dhaka",
city: [{
name:"Tangail",
lat: '11'
}, {
name:"Jamalpur",
lat: '12'
}]
}, {
name: "Khulna",
city: [{
name:"Jossore",
lat: '22'
}, {
name:"Tangail",
lat: '23'
}]
}, {
name: "Rajshahi",
city: [{
name:"Pabna",
lat: '33'
}, {
name:"Rangpur",
lat: '33'
}]
}]
},{
name: "India",
province: [{
name:"West Bengal",
city: [{
name:"Calcutta",
lat: '111'
}, {
name:"Tangail",
lat: '112'
}]
}, {
name: "Uttar Pradesh",
city: [{
name:"Agra",
lat: '122'
}, {
name:"Tajmahal",
lat: '123'
}]
}, {
name: "Rajasthan",
city: [{
name:"Kanpur",
lat: '131'
}, {
name:"Jaypur",
lat: '132'
}]
}]
}]
}
Here I have two countries with provinces and cities. 在这里,我有两个具有省市的国家。 Here user can search any input like country, province or city.
用户可以在这里搜索任何输入,例如国家,省或城市。 For example, for
Tangail
it should return all 3 result. 例如,对于
Tangail
它应该返回所有3个结果。
Expected Output: 预期产量:
[{
name:"Tangail",
lat: '11'
},{
name:"Tangail",
lat: '23'
}, {
name:"Tangail",
lat: '112'
}]
I have tried as like as given below : 我已经尝试如下所示:
function findName(obj, name) { return obj.name.trim() === name; }
function information( countryList, searchValue, current, state ) {
let nextState; // state is used to prevent call of undefined data
if ( state === "province" ) {
nextState = "city"; current = "country";
} else if( state === "city" ) {
nextState = "empty"; current = "province";
} else {
nextState = ""; current = "city";
}
// search matching data
let data = countryList.find( val => findName( val, searchValue ) );
// if not data found
if( typeof data === 'undefined' && nextState !== '' ) {
let len = countryList.length;
for( let x = 0; x < len; x++ ) { // now search all immediate child data
let status = {};
status.name = countryList[x].name;
status.lebel = current;
let info;
info = information(countryList[x][state], searchValue, current, nextState); // recursive call
if( typeof info !== 'undefined' ) { // if data found
return { state: status, data: info };
}
}
// return results;
} else {
return data;
}
}
let state = "province";
let current = "country";
let searchValue = "Tangail";
let abc = information( countryList.country, searchValue, current, state);
console.log("abc : ", abc);
And output is always first match value. 并且输出始终是第一个匹配值。
Any suggestion? 有什么建议吗? Thanks in Advance.
提前致谢。
NB: I'm using javascript
注意:我正在使用
javascript
First convert into a list of cities using #reduce
function - then filter using the search string from that array - see demo below: 首先使用
#reduce
函数转换为城市列表-然后使用该数组中的搜索字符串进行过滤 -请参见下面的演示:
let countryList={country:[{name:"Bangladesh",province:[{name:"Dhaka",city:[{name:"Tangail",lat:"11"},{name:"Jamalpur",lat:"12"}]},{name:"Khulna",city:[{name:"Jossore",lat:"22"},{name:"Tangail",lat:"23"}]},{name:"Rajshahi",city:[{name:"Pabna",lat:"33"},{name:"Rangpur",lat:"33"}]}]},{name:"India",province:[{name:"West Bengal",city:[{name:"Calcutta",lat:"111"},{name:"Tangail",lat:"112"}]},{name:"Uttar Pradesh",city:[{name:"Agra",lat:"122"},{name:"Tajmahal",lat:"123"}]},{name:"Rajasthan",city:[{name:"Kanpur",lat:"131"},{name:"Jaypur",lat:"132"}]}]}]}; // convert into list of cities var cities = countryList.country.reduce(function(p,c){ c.province.forEach(function(e) { e.city.forEach(function(k){ p.push(k); }); }); return p; },[]); // filter based on the search string var result = cities.filter(function(e) { return e.name == 'Tangail'; }); console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}
You could keep your style with the nested approach. 您可以使用嵌套方法保持样式。 But I suggest to use an object for the nested array properties and collect the wanted items in an array.
但是我建议对嵌套数组属性使用一个对象,并将所需的项收集到数组中。
function findName(obj, name) { return obj.name.trim() === name; } function information(object, key, search) { return object[key].reduce(function (r, o) { var temp = findName(o, search); if (temp) { r.push(o); return r; } if (states[key] && o[states[key]]) { return r.concat(information(o, states[key], search)); } return r; }, []); } var countryList = { country: [{ name: "Bangladesh", province: [{ name: "Dhaka", city: [{ name: "Tangail", lat: '11' }, { name: "Jamalpur", lat: '12' }] }, { name: "Khulna", city: [{ name: "Jossore", lat: '22' }, { name: "Tangail", lat: '23' }] }, { name: "Rajshahi", city: [{ name: "Pabna", lat: '33' }, { name: "Rangpur", lat: '33' }] }] }, { name: "India", province: [{ name: "West Bengal", city: [{ name: "Calcutta", lat: '111' }, { name: "Tangail", lat: '112' }] }, { name: "Uttar Pradesh", city: [{ name: "Agra", lat: '122' }, { name: "Tajmahal", lat: '123' }] }, { name: "Rajasthan", city: [{ name: "Kanpur", lat: '131' }, { name: "Jaypur", lat: '132' }] }] }] }, states = { country: 'province', province: 'city', city: '' }; console.log(information(countryList, 'country', 'Tangail'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.