2015-10-28 3 views
3

Непонятно, как удалить дубликаты с использованием параметра dupDetector в Bloodhound.Typeahead/Bloodhound: Удаление дубликатов из локальных

Я использую v 0.11.1

Тяговая набор данных из базы данных с записями, как это:.

building_name room department 
Rooney   123 English 
Rooney   456 Chemistry 
Rooney   987 Chemistry 
Meyer   65 Dog Walking 
Flatiron  498 Weaving 

Мой Bloodhound вызов:

var buildingName = new Bloodhound({ 
     datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'room', 'department'), 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     local: buildingJson, 
     dupDetector: function(remoteMatch, localMatch) { 
     return remoteMatch.building_name === localMatch.building_name; 
     } 
}); 

Функционально Ищу for - возможность поиска Rooney, 456 или на английском языке, и в результирующем наборе отображается только одно имя здания, так как это имя здания одинаково для всех трех результатов. В настоящее время он возвращает все три записи в списке.

Возможно ли это?

Вся информация, которую я могу найти о dupDetector, сравнивала дистанционную и предварительную выборку. Я использую только один источник данных, у него просто несколько записей с тем же именем.

+0

Вы на правильном пути, вы попробовали 'return remoteMatch.name === localMatch.name' вместо' building_name'? – gmaniac

+0

Wut? Нет атрибута с надписью «name» – Xogle

ответ

0

К сожалению, dupDetector работает только с удаленным или предварительно выбранным источником данных.

Есть проблемы с локальным источником данных, поэтому почему ваш dupDetector не работает. Его никогда не называют. Попробуйте использовать console.log, чтобы увидеть это.

https://github.com/twitter/typeahead.js/issues/606#issuecomment-51221195

Похоже, вы загружаете из JSON в любом случае, так почему бы не просто поп его на «локальный» сервер и «предвыборку» это вместо него. В противном случае, похоже, вам придется делать это вручную.

var buildingName = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'room', 'department'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    prefetch: ../buildingJson.json, 
    dupDetector: function(remoteMatch, localMatch) { 
     return remoteMatch.building_name === localMatch.building_name; 
    } 
}); 
+0

ok, поэтому, если dupDtector отключен для локальных выборок, означает ли это, что мой единственный вариант - отредактировать мою локальную базу данных? Есть ли способ проанализировать объект возврата Bloodhound, прежде чем он попадет в результирующий набор? Я мог бы написать цикл, чтобы удалить дубликаты, я думаю. –

+0

Почему бы вам просто не «предварительно выбрать» его «локально» в файле JSON. Теоретически это должно работать. – Xogle

+0

Ну, я изначально делал это, но я решил поменять локальную выборку, так как мне нужно создать и запустить file_put_contents, когда db будет запрошен и запущен. Я попробую. –