lodash库有很多有用的函数。使用它,您有以下选项:
1. 二分查找
创建一个新结构,其中包含排序后的数字数组。在查找数字时,应用二分查找。
_.sortedIndexOf()方法在数组中使用二分查找。
var bookCategory = {
"fantasy": [10064, 10066, 10071],
"scifi": [10060, 10037, 10061],
"history": [10001, 10003, 10004, 10005],
"biography": [10032, 10006, 10002, 10028, 10009, 10030, 100031],
"educational": [10025]
};
var binaryMap = _.mapValues(bookCategory, function(category) {
return category.sort(function(num1, num2) {
return num1 - num2;
});
});
var number = 10032;
var keyForNumber = _.findKey(binaryMap, function(numbers) {
return _.sortedIndexOf(numbers, number) !== -1;
});
keyForNumber
请查看工作中的演示。
2. 创建地图对象
由于数字只会出现一次,因此很容易创建一个大的哈希对象,其中键是数字,值是类别。它需要更多的内存,因为复制了类别字符串,但它运行得相当快。
这个解决方案不需要lodash。
var bookCategory = {
"fantasy": [10064, 10066, 10071],
"scifi": [10060, 10037, 10061],
"history": [10001, 10003, 10004, 10005],
"biography": [10032, 10006, 10002, 10028, 10009, 10030, 100031],
"educational": [10025]
};
var map = _.reduce(bookCategory, function(result, numbers, key) {
_.each(numbers, function(number) {
result[number] = key;
});
return result;
}, {});
var mapAlternative = Object.keys(bookCategory).reduce(function(result, key) {
bookCategory[key].forEach(function(number) {
result[number] = key;
});
return result;
}, {});
var number = 10003;
map[number];
检查工作中的
演示。
10001
和300
的输出应该是什么? - Salvador Dali