【问题标题】:Using javascript to search a limited and manually made index使用 javascript 搜索有限且手动创建的索引
【发布时间】:2013-04-09 00:26:48
【问题描述】:

我有几个包含多媒体内容(flash)的页面,我希望能够通过一个页面搜索它的内容。

由于它的内容不可搜索,并且我有一个文档,其中包含将出现在每个页面中的所有单词/图像描述,我正在考虑将此内容写在几个页面中,将它们链接到带有多媒体的相应页面内容,并使用搜索引擎来索引这些信息。

但这看起来过于复杂了。所以我虽然使用 javascript 并将每个页面的关键字插入到它自己的数组中,当用户搜索它时,它会与每个数组进行比较并打印: "此内容可在以下页面中找到:"

这看起来很简单,但我想听听更有经验的人的一些意见: - 对于我将遇到的问题; - 或更好/更简单的解决方案。

我要求任何做出贡献的人都认为我没有编程经验。

【问题讨论】:

    标签: javascript search-engine


    【解决方案1】:

    这听起来像是 Array.prototype.filter 的工作。
    你还没有描述数据结构,所以我假设 ArrayObject s。

    假设你有这个数据结构,

    var all_items = [
        {url: 'a', title:'First Entry', description:'Foo'},
        {url: 'b', title:'Second Entry', description:'Bar'},
        {url: 'c', title:'Third Entry', description:'FooBar'}
        // etc..
    ];
    

    你可以像这样写一个基于.filter的搜索函数

    function search(arr, str, url /* =true */, title /* =true */, desc /* =false */) {
        var src_fnc;
        // set true defaults
        if (undefined === url) url = true;
        if (undefined === title) title = true;
        // toBool
        url = url && true || false;
        title = title && true || false;
        desc = desc && true || false;
        // make function
        src_fnc = function (e) {
            if (url && e.url.indexOf(str) >= 0) return true;
            if (title && e.title.indexOf(str) >= 0) return true;
            if (desc && e.description.indexOf(str) >= 0) return true;
            return false;
        };
        return arr.filter(src_fnc);
    }
    

    然后调用它

    search(all_items, 'ir');
    /*  [
            {url: 'a', title:'First Entry', description:'Foo'},
            {url: 'c', title:'Third Entry', description:'FooBar'}
        ] */
    

    【讨论】:

    • 嗯...我正在考虑为每个页面设置一个单独的数组对象,并让引擎检查每个字符串是否匹配(因为人们大部分时间都会搜索特定的单词)。然后,如果找到匹配项,它将返回:“在这些页面中找到匹配项:- 模块 1 - 食物;- 模块 5 - 旅行。”谢谢,顺便说一句。
    • 为此,只需运行此函数 x 次,其中 x 是您拥有的 Array 的数量,使用适当的数组而不是 all_items (以及使函数与您的数据匹配的其他修复)。
    • 好的。谢谢你。你还有什么建议吗?这是一个不好的做法吗?还有其他更有效的方法吗?你的更好吗?我真的在努力学习,我知道我不应该做半途而废的编码......
    • 嗯,这取决于你有什么,你还没有分享,所以我的回答是基于假设。还有一种不同的方法,那就是制作一个 iterator 或“生成器”。如果您使用该方法,则不必一次将所有内容加载到内存中,而且您可以使用window.setTimeout 引入小间隙,这意味着页面不会因大量数据而冻结。
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2016-01-12
    • 2021-10-10
    • 1970-01-01
    • 2020-07-28
    • 2011-03-20
    • 2017-07-07
    • 2021-05-14
    相关资源
    最近更新 更多