3

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

2 回答 2

6

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

然后,您可以提供 Fuse,如下所示的键:Object.keys(myobject).

编辑:

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

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

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

于 2016-11-15T21:56:14.970 回答
5

首先解析你的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"] });
于 2016-11-15T21:59:10.013 回答