2016-11-15 123 views
1

我想對平面層次結構的對象執行模糊搜索。在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", 

回答

3

你可以拿到鑰匙使用Object.keys()功能動態對象。如果您希望支持較舊的瀏覽器,則可以在Polyfill中找到一個polyfill實現here(在Polyfill下)。

然後,你可以提供保險絲,像這樣的鑰匙:Object.keys(myobject)

編輯:

爲了改造對象本身,你可以做類似的東西是什麼喬丹曾建議:

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

然後鍵數組是['id'],你應該通過ID進行搜索。

+0

謝謝葛森,該W掃。我得到了我的對象的所有鍵。不幸的是我不得不在Array中使用而不是Object。 GitHub API只返回一個JSON對象。 – marcobiedermann

+0

@marcobiedermann使用你給出的例子'Object.keys(data)'應該返回'[100,1234,+1, - 1]'。這不是你需要的嗎? –

+0

是的,您的評論是正確的。但正如我所提到的,Fuse.js需要一個數組來搜索。 GitHub只是返回一個Object。 – marcobiedermann

2

首先分析你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"] }); 
+0

謝謝你的回答。不幸的是,我沒有一個數組來尋找。來自GitHub API的響應是一個JSON對象 – marcobiedermann

+0

沒問題。一旦收到數據,首先改變其結構。我會更新我的答案。 –

+0

@marcobiedermann你可以再次檢查我的答案。 –