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;
});
});
//then search using binary algorithm
var number = 10032;
var keyForNumber = _.findKey(binaryMap, function(numbers) {
return _.sortedIndexOf(numbers, number) !== -1;
});
keyForNumber // prints "biography"
檢查工作demo。
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;
}, {});
// or alternative without lodash
var mapAlternative = Object.keys(bookCategory).reduce(function(result, key) {
bookCategory[key].forEach(function(number) {
result[number] = key;
});
return result;
}, {});
var number = 10003;
map[number]; // prints "history"
檢查工作demo。
應該是什麼'10001'和'300'是輸出? –
@SalvadorDali這些數字不在任何數組中,因此類別將保持「未定義」。 – diplosaurus
如果這些不同 - 創建一個從值到類別的映射。 – zerkms