2017-10-14 7 views
0

So baue ich ein Programm in JavaScript und ich brauche für Werte innerhalb eines mehrdimensionalen Wörterbuch wie folgt zu:Binäre Suche im mehrdimensionalen Wörterbuch?

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'; 

Ursprünglich ich einen linearen Suchalgorithmus zu implementieren, würde aber das Wörterbuch wird Hunderte bis Tausende halten von Werten im Inneren. Stellen Sie sich vor, das Wörterbuch über ^^ hat vielleicht 1200 Schlüssel-Wert-Paare und der Wert für jede Taste ist ein anderes Wörterbuch. Ich bin mir nicht sicher, wie man dafür einen Suchalgorithmus erstellt. Hier ist der Code, den ich bisher für ein Array haben:

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); 

aber ich brauche diesen Suchalgorithmus den Index der passenden Suchwert zurückzukehren. Irgendwelche Lösungen für dieses Problem? Wenn ich laufen:

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

Das klingt verwirrend, weil im nicht sicher, wie dies zu erklären, aber hoffentlich meinen Code hilft. Auf der hellen Seite, wenn Sie das lösen, werden Sie einen neuen Algorithmus erstellen. Da die binäre Suche für Arrays ist, wird diese für mehrdimensionale Wörterbücher verwendet, so dass etwas auf einen Lebenslauf gelegt werden kann. :)

+1

was ist das erwartete Ergebnis? Hinweis: Verwenden Sie den Suchwert als Schlüssel. –

+0

der erwartete Wert ist der Index des passenden Suchwertschlüssels – Jeebs600

+0

tatsächlich sehe ich keinen * index * im Objekt. –

Antwort

1

Sie können eine Object.entries() verwenden, um ein normales JavaScript-Objekt in ein Array mit einem Array von Eigenschaftsnamen, Wertpaare entsprechend den Eigenschaften und Werten des Objekts, Map Objekt zum Speichern der Objekte nach Eigenschaftsnamen eines Objekts zu konvertieren. .findIndex() der Index der Eigenschaften und Werte innerhalb des Objekts zu erhalten, Array umgewandelt

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

Sie haben soeben die searchValue als Schlüssel für das Objekt verwenden könnte. Der Schlüssel funktioniert mit Klammern als für das Objekt.

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]);