【问题标题】:Advanced search with Javascript - Need some advice使用 Javascript 进行高级搜索 - 需要一些建议
【发布时间】:2017-03-21 09:59:52
【问题描述】:

我一直纠结于一些我需要实现的高级搜索功能。我有一个包含电影名称、演员、导演、国家和类型的搜索表,我需要能够搜索名称和演员、导演、国家和类型等。

我的问题是:如果我事先不知道用户正在搜索哪些数据,我该如何实施?

我在一个数组中有这种形式的电影对象:

{
    "year": 1957,
    "otitle": "Ni liv",
    "youtube trailer id": "",
    "ntitle": "Ni liv",
    "mod_date": null,
    "length": 91,
    "id": 1080,
    "keywords": null,
    "reg_date": null,
    "description": "Jan Baalsrud er p\u00e5 et sabotasjeoppdrag fra England til Norge med 11 andre vinteren 1943, da fiskeb\u00e5ten deres angripes av en tysk patruljeb\u00e5t. Som eneste overlevende lykkes det Baalsrud \u00e5 unnslippe og en farefull reise mot n\u00f8ytrale Sverige begynner. Etter flere uker i sn\u00f8massene i de steile norske fjellene blir han sn\u00f8blind og m\u00e5 til slutt skj\u00e6re av seg sine frostskadde t\u00e6r for \u00e5 overleve. \n\nDen mest fremtredende norske filmregiss\u00f8r etter 2. verdenskrig, Arne Skouen, har med denne filmen laget et mesterverk, som ble nominert til Oscar for beste utenlandske film i 1957, og siden k\u00e5ret til Norges beste film gjennom tidene. Det vidunderlige norske landskapet danner bakgrunn for den sanne historien om Jan Baalsruds utrolige flukt fra den tyske h\u00e6r. Jack Fjeldstad (Gull Og Gr\u00f8nne Skoger) spiller Baalsrud med imponerende overbevisning, og ble i 1985 sl\u00e5tt til ridder av St. Olavordenen for sitt fremragende arbeid i norsk filmkunst. ",
    "dir": "Arne Skouen",
    "etitle": "Nine Lives",
    "country": "NOR",
    "imdb_id": "",
    "folk": "Jack Fjeldstad, Henny Moan, Alf Malland, Joachim Holst-Jensen, Lydia Op\u00f8ien, Edvard Drabl\u00f8s"
}

查询参数是这种形式

{
  film_title:"King Kong",
  director:"",
  genre:"action",
  country: "",
  actor: "Jack Black"
 }

我真的需要编写 25 个不同的 if-else-blocks 来检查每种可能的搜索情况吗?这似乎很乏味且容易出错。

非常感谢任何可以将我推向正确方向的提示或想法!

【问题讨论】:

  • 你能说得更具体点吗?
  • 当然,假设我作为用户想要搜索以杰克布莱克为主角的动作片,查询参数将是 {actor: "Jack Black",genre: "Action"},然后在我的代码中我会有类似的东西 if(query_params.actor === someActor from the movieObject && query_params.genre === someGenre from MovieObject) // 然后添加到结果列表中。但是当我也想搜索国家时,问题就来了。或者说国家和演员,而不是类型。
  • 但是..你不应该在javascript上这样做..
  • 现在的任务是使用 Javascript 完成它。
  • 您需要遵守所有搜索条件吗?

标签: javascript search


【解决方案1】:

您可以对查询使用与数据对象中相同的键,并通过迭代查询的键来过滤结果并检查元素是否包含所需的文本。

function getItems(array, search) {
    return array.filter(function (a) {
        return Object.keys(search).every(function (k) {
            return !search[k] || a[k].toLowerCase().indexOf(search[k].toLowerCase()) !== -1;
        });
    });
}

var data = [{ year: 1957, film_title: "King Kong", director: "", genre: "action", country: "", actor: "Jack Black" }, { year: 2000, film_title: "Foo", director: "", genre: "action", country: "", actor: "" }],
    query = { film_title: "King Kong", director: "", genre: "action", country: "", actor: "Jack Black" },
    result = getItems(data, query);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    不完全确定你想要什么,但如果你想把数据库排除在外:

    function multiFilterSearch(arrayOfMovieObjs, queryParamObj){
        var filteredSearch = arrayOfMovieObjs;
        for(var key in queryParamObj){
            filteredSearch = filteredSearch.filter(function(movieObj) {
                // Throw away movieObj that lacks the search key altogether
                if(typeof movieObj[key] === undefined) return false;
    
                // For movieObjs with the search key, keep only those where the search value matches the query.
                else if(movieObj[key] === queryParamObj[key]) return true;
                else return false;
            });
        }
        return filteredSearch;
    }
    

    这效率低下(即,它运行过滤过程的频率与搜索键一样多,而不是连接filter() 的条件),可以改进。但是,我的午休时间已经结束,所以我不能多想!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多