json数组中,如何快速查询到数组中到某个对象
列:const json=[{a:1,b:2},{a:2,b:1}…]; 获取数组中对象a=10001的对象,然后知道b的值。除了遍历,有没有更高效简洁的算法实现获取
5 回复
const json=[{a:1,b:2},{a:2,b:1}…,{a:10001,b:1}]; const map={}; for(let i=0;i<json.length;i++){ map[json[i].a]=json[i]; } console.log(map[“10001”]);
for循环比较耗时,但只要耗时一次。之后使用map对象。极速
console.log(map[“10001”].b);
for(var i = 0, len = a.length; i < len; i++)
老的最佳实践果然还没过时
测试代码
var a = new Array(1<<20)
var noop = function () {}
var f1 = function () {
for(var i = 0; i < a.length; i++) noop();
}
var f2 = function () {
for(var i = 0, len = a.length; i < len; i++) noop();
}
for(var i = 0; i < 1000; i++) {
f1();
f2();
}
console.time("f1");
f1();
console.timeEnd("f1");
console.time("f2");
f2();
console.timeEnd("f2");
结果
f1: 1.149ms
f2: 0.952ms
node -v
v11.5.0
除非只用一次,就用 arr.find(item => item.a === 1)
, 再取 b 的值。
否则通常可以转成一个 map 再查:
const aMap = _.keyBy(arr, 'a'); // {'1': {a: 1, b:2}, '2':{a:'2',b:2} }
const target = aMap['b'];
_.keyBy 可以用原生的 reduce 实现,很简单
如果是高频使用场景,还是用数据库来实现吧。