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"] });

Моя настройка:

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",

2 ответа

Решение

Вы можете получить ключи для вашего динамического объекта, используя Object.keys() функция. Если вы хотите поддерживать более старые браузеры, вы можете найти реализацию polyfill здесь (в разделе Polyfill).

Затем вы можете поставить Fuse, ключи вот так: Object.keys(myobject),

РЕДАКТИРОВАТЬ:

Чтобы трансформировать сам объект, вы можете сделать что-то похожее на то, что предложил Джордан:

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

И тогда массив ключей ['id'] и вы должны искать по идентификатору.

Сначала разбери свой 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"] });
Другие вопросы по тегам