Javascript Fuse.js:类数组对象中的模糊搜索

Javascript Fuse.js:类数组对象中的模糊搜索,javascript,search,web,fuzzy-search,fuse.js,Javascript,Search,Web,Fuzzy Search,Fuse.js,我希望对具有平面层次结构的对象执行模糊搜索。在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"]

我希望对具有平面层次结构的对象执行模糊搜索。在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",

您可以使用
object.keys()
函数获取动态对象的关键点。如果您也希望支持较旧的浏览器,您可以找到polyfill实现(在polyfill下)

然后,您可以提供保险丝,按键如下:
Object.keys(myobject)

编辑:

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

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

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

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

然后,您可以提供保险丝,按键如下:
Object.keys(myobject)

编辑:

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

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

然后密钥数组是
['id']
,您应该按id进行搜索。

首先解析
数据:

const data = JSON.parse(json);
然后是一种方法(但肯定会比第二种建议慢,因为搜索中包含所有键):

或者,您可以动态更改数据结构:

let structuredData = [];

for (key in data)
    structuredData.push({
        "id": key,
        "url": structuredData[key]
    });

const fuse = new Fuse(structuredData, { keys: ["id"] });

首先分析您的
数据

const data = JSON.parse(json);
然后是一种方法(但肯定会比第二种建议慢,因为搜索中包含所有键):

或者,您可以动态更改数据结构:

let structuredData = [];

for (key in data)
    structuredData.push({
        "id": key,
        "url": structuredData[key]
    });

const fuse = new Fuse(structuredData, { keys: ["id"] });

谢谢你的回答。不幸的是,我没有要查找的数组。GithubAPI的响应是JSON对象,没有问题。一旦收到数据,首先更改其结构。我会更新我的答案。非常感谢。在你发布答案的那一刻,我自己就明白了。parse(data)不起作用,因为这要求对象位于字符串(“{”key:“value”,“key:“value”}”)中。如果来自GitHub的响应是一个具有JSON结构的字符串,则首先解析它。如果在成功回调中直接接收到JSON对象,则跳过解析步骤。感谢您的回答。不幸的是,我没有要查找的数组。GithubAPI的响应是JSON对象,没有问题。一旦收到数据,首先更改其结构。我会更新我的答案。非常感谢。在你发布答案的那一刻,我自己就明白了。parse(data)不起作用,因为这要求对象位于字符串(“{”key:“value”,“key:“value”}”)中。如果来自GitHub的响应是一个具有JSON结构的字符串,则首先解析它。如果在成功回调中直接接收到JSON对象,则跳过解析步骤。谢谢Gershon,这项工作。我得到我物体的所有钥匙。不幸的是,我不得不使用数组而不是对象。GitHub API只返回一个JSON对象。@marcobiedermann使用您给出的示例
对象。键(数据)
应该返回
[1001234,+1,-1]
。这不是你需要的吗?是的,你的评论是对的。但正如我提到的,Fuse.js需要一个数组来搜索。GitHub只返回一个对象。谢谢Gershon,这项工作。我得到我物体的所有钥匙。不幸的是,我不得不使用数组而不是对象。GitHub API只返回一个JSON对象。@marcobiedermann使用您给出的示例
对象。键(数据)
应该返回
[1001234,+1,-1]
。这不是你需要的吗?是的,你的评论是对的。但正如我提到的,Fuse.js需要一个数组来搜索。GitHub只返回一个对象。