【问题标题】:Fuse.js: Fuzzy search in Array like objectFuse.js:类似对象的数组中的模糊搜索
【发布时间】:2016-11-15 21:46:25
【问题描述】:

我想对具有平面层次结构的对象执行模糊搜索。在 Fuse.js 的演示页面上,您必须指定要在对象中查找的键。不幸的是,我没有特定的标识符。

Fuse.js 演示:

var books = [{
  title: "Old Man's War",
  author: {
    firstName: "John",
    lastName: "Scalzi"
  }
}];
var fuse = new Fuse(books, { keys: ["title", "author.firstName"] });

我的设置:

const data = {
  "100": "https://assets-cdn.github.com/images/icons/emoji/unicode/1f4af.png?v6",
  "1234": "https://assets-cdn.github.com/images/icons/emoji/unicode/1f522.png?v6",
  "+1": "https://assets-cdn.github.com/images/icons/emoji/unicode/1f44d.png?v6",
  "-1": "https://assets-cdn.github.com/images/icons/emoji/unicode/1f44e.png?v6"
};

const fuse = new Fuse(data, { keys: ??? });
fuse.search('+1'); // should return "https://assets-cdn.github.com/images/icons/emoji/unicode/1f44d.png?v6",

【问题讨论】:

    标签: javascript search web fuzzy-search fuse.js


    【解决方案1】:

    您可以使用Object.keys() 函数获取动态对象的键。如果您也希望支持旧版浏览器,您可以找到一个 polyfill 实现 here(在 Polyfill 下)。

    然后,您可以提供 Fuse,密钥如下:Object.keys(myobject)

    编辑:

    为了转换对象本身,您可以执行类似于 Jordan 建议的操作:

    var newData = Object.keys(data).map(function(key) {
      return { id: key, link: data[key]};
    }) 
    

    然后键数组是['id'],你应该按id搜索。

    【讨论】:

    • 谢谢 Gershon,这项工作。我得到了我的对象的所有键。不幸的是,我必须在数组而不是对象中使用。 GitHub API 只返回一个 JSON 对象。
    • @marcobiedermann 使用你给出的例子Object.keys(data) 应该返回[100, 1234, +1, - 1]。这不是你需要的吗?
    • 是的,您的评论是正确的。但正如我提到的,Fuse.js 需要一个数组来搜索。 GitHub 只返回一个对象。
    【解决方案2】:

    首先解析你的data:

    const data = JSON.parse(json);
    

    然后是一种方法(但肯定会比第二个建议慢,因为所有键都包含在搜索中):

    const fuse = new Fuse(data, { keys: data.keys() });
    

    或者你可以动态改变你的数据结构:

    let structuredData = [];
    
    for (key in data)
        structuredData.push({
            "id": key,
            "url": structuredData[key]
        });
    
    const fuse = new Fuse(structuredData, { keys: ["id"] });
    

    【讨论】:

    • 感谢您的回答。不幸的是,我没有要查找的数组。来自 GitHub API 的响应是一个 JSON 对象
    • 没问题。一旦接收到数据,首先改变它的结构。我会更新我的答案。
    • 非常感谢。我只是在您发布答案的那一刻自己弄清楚了这一点。 JSON.parse(data) 不起作用,因为这要求对象位于 String ("{ "key": "value", "key": "value"}")
    • 如果来自 GitHub 的响应是一个 JSON 结构的字符串,那么首先解析它。如果在成功回调中直接收到 JSON 对象,则跳过解析步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多