2017-10-14 11 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 

これは説明する方法がわかりませんが、私のコードが役立つので、混乱するかもしれません。明るい側でこれを解決すれば、新しいアルゴリズムを作成します。バイナリ検索は配列のためであり、これは多次元辞書用であり、再開時に何かを置くためのものです。 :)

+1

期待される結果は何ですか?ヒント:seach値をキーとして使用します。 –

+0

期待値は、一致する検索値キー – Jeebs600

+0

のインデックスです。実際には、オブジェクト内に*インデックス*はありません。 –

答えて

1

Object.entries()を使用すると、JavaScriptプレーンオブジェクトをオブジェクトのプロパティと値に対応する値のペアの配列(オブジェクトのプロパティ名でオブジェクトを格納するMapオブジェクト)に変換できます。オブジェクト内のプロパティと値のインデックスを取得する.findIndex()は、あなただけのオブジェクトのキーとしてsearchValueを使用することができ、アレイ

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

に変換します。キーは、オブジェクトの場合は角括弧(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]);