2016-11-15 3 views
1

Ich möchte eine unscharfe Suche auf einem Objekt mit einer flachen Hierarchie durchführen. Auf der Demoseite von Fuse.js müssen Sie einen Schlüssel angeben, nach dem im Objekt gesucht werden soll. Leider habe ich keine spezifische Kennung.Fuse.js: Unscharfe Suche in Array wie Objekt

Fuse.js Demo:

var books = [{ 
    title: "Old Man's War", 
    author: { 
    firstName: "John", 
    lastName: "Scalzi" 
    } 
}]; 
var fuse = new Fuse(books, { keys: ["title", "author.firstName"] }); 

Mein Setup:

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

Antwort

3

Sie könnten die Schlüssel für Ihr dynamisches Objekt erhalten mit der Object.keys() Funktion. Wenn Sie auch ältere Browser unterstützen möchten, finden Sie eine Polyfill-Implementierung here (unter Polyfill).

Dann könnten Sie Fuse, die Schlüssel wie folgt liefern: Object.keys(myobject).

EDIT:

Um das Objekt zu verwandeln selbst Sie etwas Ähnliches, was Jordan vorgeschlagen tun könnte:

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

Und dann die Tasten Array ist ['id'] und Sie sollten durch die ID suchen.

+0

Danke Gershon, diese w Ork. Ich bekomme alle Schlüssel meines Objekts. Leider muss ich in Array statt eines Objekts verwenden. Die GitHub-API gibt nur ein JSON-Objekt zurück. – marcobiedermann

+0

@marcobiedermann mit dem Beispiel, das Sie angegeben haben, "Object.keys (data)" sollte '[100, 1234, +1, - 1]' zurückgeben. Brauchst du das nicht? –

+0

Ja, Ihr Kommentar ist richtig. Aber wie gesagt, Fuse.js benötigt ein Array, um zu suchen. GitHub gibt nur ein Objekt zurück. – marcobiedermann

2

Zuerst analysieren Ihre data:

const data = JSON.parse(json); 

Dann einen Weg, es zu tun (aber sicher wäre es als zweite Vorschläge langsamer sein, weil alle Schlüssel sind in die Suche einbezogen):

const fuse = new Fuse(data, { keys: data.keys() }); 

Oder Sie können dynamisch Ihre Datenstruktur ändern:

let structuredData = []; 

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

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

Vielen Dank für Ihre Antwort. Leider muss ich nicht nach einem Array suchen. Die Antwort von der GitHub-API ist ein JSON-Objekt. – marcobiedermann

+0

Kein Problem. Sobald Daten empfangen werden, ändern Sie zunächst ihre Struktur. Ich werde meine Antwort aktualisieren. –

+0

@marcobiedermann können Sie meine Antwort noch einmal überprüfen. –