我在JavaScript中有一组数字数组。我的目标是获取包含特定数字的值的键。我也对可能更有效的不同数据结构持开放态度。
let bookCategory = {
"fantasy": [10064, 10066, 10071],
"scifi": [10060, 10037, 10061],
"history": [10001, 10003, 10004, 10005],
"biography": [10032, 10006, 10002, 10028, 10009, 10030, 100031],
"educational": [10025]
};
每个数字只会出现一次,但每个数组可以包含近一百个数字,并且它可能会从那里大幅增长。数组可以是不可变的,因为我的数据是静态的。
现在我有这个,但它看起来效率不高。
let category;
let keys = _.keys(categories);
let theNumber = 10032;
for(let j = 0; j < keys.length; j++) {
if(_.includes(categories[keys[j]], theNumber)) {
category = keys[j];
break;
}
}
答案 0 :(得分:1)
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。
答案 1 :(得分:0)
回答这个问题的SELECT DateAdd(a.date, d, i.days)
FROM (select min(date) from table_A) a, intervals I
WHERE DateAdd(a.date, d, i.days) < (select max(date) from table_A)
AND NOT EXISTS (select 1 from table_A aa where aa.date = DateAdd(a.date, d, i.days))
太多了,最大的问题是:数据的频率是what-ifs
还是updated
。
如果要更频繁地read
,那么首先遍历read
并创建一个稀疏数组/对象,将数字链接回类别。
(我会在这里寻找对象):
bookCategory
答案 2 :(得分:0)
对数组进行排序并使用二进制搜索。您可以使用lodash lib轻松完成。
答案 3 :(得分:0)
我建议使用哈希表来表示数字。
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]
},
numbers = function (data) {
var r = Object.create(null);
Object.keys(data).forEach(k => data[k].forEach(a => r[a] = k));
return r;
}(bookCategory)
document.write('<pre>' + JSON.stringify(numbers, 0, 4) + '</pre>');