多维字典中的二进制搜索?
Binary Search in multidimensional dictionary?
所以我在 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);
但是我需要这个搜索算法来 return 匹配搜索值的索引。这个问题有什么解决办法吗?如果我 运行:
binarySearch(myDict, 'flower'); // outputs undefined
这听起来可能令人困惑,因为我不确定如何解释这一点,但希望我的代码能有所帮助。从好的方面来说,如果你解决了这个问题,你将创建一个新的算法。因为二进制搜索是针对数组的,所以这个是针对多维字典的,所以这可以放在简历上。 :)
您可以使用 Object.entries()
将 JavaScript 普通对象转换为 属性 名称数组的数组,对应于对象的属性和值的值对,Map
object 按 属性 对象名称存储对象, .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);
您可以只使用 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]);
所以我在 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);
但是我需要这个搜索算法来 return 匹配搜索值的索引。这个问题有什么解决办法吗?如果我 运行:
binarySearch(myDict, 'flower'); // outputs undefined
这听起来可能令人困惑,因为我不确定如何解释这一点,但希望我的代码能有所帮助。从好的方面来说,如果你解决了这个问题,你将创建一个新的算法。因为二进制搜索是针对数组的,所以这个是针对多维字典的,所以这可以放在简历上。 :)
您可以使用 Object.entries()
将 JavaScript 普通对象转换为 属性 名称数组的数组,对应于对象的属性和值的值对,Map
object 按 属性 对象名称存储对象, .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);
您可以只使用 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]);