【问题标题】:Dynamic Programming: return all match data动态规划:返回所有匹配数据
【发布时间】:2018-01-17 07:31:40
【问题描述】:

我写了一个简单的动态程序,它可以返回第一个匹配的数据。现在我想获取所有匹配的数据。我的数据:

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'
            }]
        }]
    }]
}

这里我有两个国家的省和市。在这里,用户可以搜索任何输入,如国家、省或城市。例如,对于Tangail,它应该返回所有 3 个结果。

预期输出:

[{
    name:"Tangail",
    lat: '11'
},{
    name:"Tangail",
    lat: '23'
}, {
    name:"Tangail",
    lat: '112'
}] 

我已经尝试过如下所示:

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

并且输出总是第一个匹配值。

有什么建议吗?提前致谢。

注意:我正在使用javascript

【问题讨论】:

    标签: javascript arrays recursion dynamic-programming


    【解决方案1】:

    首先使用 #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;}

    【讨论】:

    • 你能帮我在c编程中得到这个结果吗?
    • 没问题,你做过的已经够远了
    【解决方案2】:

    您可以使用嵌套方法保持您的风格。但我建议为嵌套数组属性使用一个对象,并在一个数组中收集想要的项目。

    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; }

    【讨论】:

    • 你能帮我在c编程中得到这个结果吗?
    • 对不起,其实没有。
    • 没问题,你做过的已经够远了
    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 2016-07-20
    • 2018-12-21
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多