【问题标题】:Refine search results of array with numbers and strings用数字和字符串细化数组的搜索结果
【发布时间】:2018-06-02 19:52:40
【问题描述】:

我希望针对我正在制作的应用改进当前的搜索功能。

我目前正在从如下所示的 firebase 查询中获取一组对象

{
   make: "make",
   model: "model",
   year: 2002,
   gas: "petrol",
   mileage: "mileage",
   images: {
       image1: "url",
       image2: "url"
   },
   price: 1295
}

我目前使用 filter 方法对数组进行过滤,并将包含优化的对象与原始数组进行比较,如下所示

refine = (refinements, currentResults) => {
        return currentResults.filter(result => this.matchesAll(refinements, result));
}

matchesAll = (refinements, result) => {
        for (const key in refinements) {
            if (refinements[key] !== result[key]) {
                return false;
            }
        }
        return true;
}

这对于比较包含字符串的字段非常有用,但是如果用户想要检查最小年龄或最大价格,我不知道如何实现。

有什么建议吗?

【问题讨论】:

    标签: javascript react-native


    【解决方案1】:

    一种方法是使用字段来描述您要执行的比较类型:“min”、“max”或“equal”:

        //----refinements could be:
    
        {
        "price":
            {   "type":"max",
                "value":1000
            },
        "age":
            {   "type":"min",
                "value":18
            },
        "name":
            {   "type":"eq",
                "value":'dsjkds'
            },
        ...
        }
    

    还有你的过滤器:

        refine = (refinements, currentResults) => {
                return currentResults.filter(result => this.matchesAll(refinements, result));
        }
    
        matchesAll = (refinements, result) => {
                for (const key in refinements) {
                    if(refinements[key]['type'] === 'min'){
                        if (refinements[key] > result[key]) {
                            return false;
                        }
                    }else if(refinements[key]['type'] === 'max'){
                        if (refinements[key] < result[key]) {
                            return false;
                        }
                    }else{
                        if (refinements[key] !== result[key]) {
                            return false;
                        }
                    }
                }
                return true;
        }
    

    【讨论】:

    • 嗨@dev8080,感谢您的回复,我想过以类似的方式进行操作,但结构与您的方式不同,导致结果不准确。这看起来很完美。感谢您抽出宝贵时间回复!
    • @juicy89 没问题。随时。
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2014-10-06
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多