2017-10-14 118 views
0

所以我建立在JavaScript程序,我需要尋找值的多維字典這樣的內部:多維詞典中的二進制搜索?

var myDict = { 
    apple: {name: 'apple 1', age: 14}, 
    bear: {name: 'apple 1', age: 14}, 
    cup: {name: 'apple 1', age: 14}, 
    deer: {name: 'apple 1', age: 14}, 
    dog: {name: 'apple 1', age: 14}, 
    elephant: {name: 'apple 1', age: 14}, 
    flower: {name: 'apple 1', age: 14}, 
    frog: {name: 'apple 1', age: 14}, 
    gary: {name: 'apple 1', age: 14} 
}; 
var searchValue = 'flower'; 

本來我是打算實現線性搜索算法,但本詞典將舉行數百至數千裏面的值。所以想象上面的字典^^可能有1200個鍵值對,每個鍵的值是另一個字典。我不知道如何爲此創建一個搜索算法。下面的代碼我到目前爲止的一個數組:

var myArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
function binarySearch(inputArr, searchVal) { 
    var first = 0; 
    var final = inputArr.length - 1; 
    var middleIndex = parseInt((first + final)/2); // i used parse int because if the array is an even number i dont get like 5.5 which will create an infinite loop 
    var middleValue = inputArr[middleIndex]; 


    while(first < final) { 

    // if its the first value/index 
    if (searchVal == inputArr[first]) { 
     return first; 
    } 


    // if its the last value/index 
    if (searchVal == inputArr[final]) { 
     return final; 
    } 


    // if its the middle value/index 
    if (searchVal == middleValue) { 
     return middleIndex; 
    } 


    // if value/index is lower 
    if (searchVal < inputArr[middleIndex]) { 
     first += 1; 
    } 


    // if value/index is higher 
    if (searchVal > inputArr[middleIndex]) { 
     final -= 1; 
    } 
    } 


    return 'value does not exist'; 
} 
binarySearch(lettArr, 7); 

,但我需要這種搜索算法返回匹配搜索值的指數。任何解決這個問題的方法?如果我運行:

binarySearch(myDict, 'flower'); // outputs undefined 

由於IM不確定如何解釋這一點,但希望我的代碼可以幫助這聽起來令人困惑。如果你解決了這個問題,你會發現一個新的算法。由於二進制搜索是針對數組的,因此它將用於多維詞典,因此可以在簡歷上添加一些內容。 :)

+1

什麼是預期的結果?提示:使用seach值作爲關鍵字。 –

+0

期望值是匹配搜索值鍵的索引 – Jeebs600

+0

實際上,我看到對象中沒有*索引*。 –

回答

1

您可以使用Object.entries()將JavaScript普通對象轉換爲屬性名稱的數組數組,對象的屬性和值對應的值對,Map通過對象的屬性名稱存儲對象的對象, .findIndex()獲取對象中的屬性和值的指標轉化爲陣列

const map = new Map; 
const entries = Object.entries(myDict); // 
entries.forEach(([key, prop]) => map.set(key, prop)); 
let searchValue = "flower"; 
console.log(map.get(searchValue)); 
let index = entries.findIndex(([key]) => key === searchValue); 
console.log(index); 
1

你可以只使用searchValue爲對象的關鍵。該關鍵字與括號一起作爲對象的property accessor

var myDict = { 
 
     apple: { name: 'apple 1', age: 14 }, 
 
     bear: { name: 'apple 1', age: 14 }, 
 
     cup: { name: 'apple 1', age: 14 }, 
 
     deer: { name: 'apple 1', age: 14 }, 
 
     dog: { name: 'apple 1', age: 14 }, 
 
     elephant: { name: 'apple 1', age: 14 }, 
 
     flower: { name: 'apple 1', age: 14 }, 
 
     frog: { name: 'apple 1', age: 14 }, 
 
     gary: { name: 'apple 1', age: 14 } 
 
    }, 
 
    searchValue = 'flower'; 
 

 
console.log(myDict[searchValue]);