使用Javascript进行高级搜索 - 需要一些建议

时间:2017-03-21 09:59:52

标签: javascript search

我很困扰我的头脑缠绕着我需要实现的一些高级搜索功能。我有一个搜索表单,包括电影片名,演员,导演,国家和流派,我需要能够搜索说出标题和演员,导演,国家和流派等等。

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

我在这个数组中有这个表单的电影对象:

{
    "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来检查每个可能的搜索案例?这似乎很乏味且容易出错。

非常感谢能够推动我朝着正确方向前进的任何提示或想法!

2 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:0)

不完全确定你想要什么,但如果你想让数据库远离图片:

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()的条件),这可以改进。但是,我的午休时间结束了,所以我不能详述它!