Javascript Fuse.js:类数组对象中的模糊搜索
我希望对具有平面层次结构的对象执行模糊搜索。在Fuse.js的演示页面上,您必须指定要在对象中查找的键。不幸的是,我没有特定的标识符 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"]
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只返回一个对象。