json数组中,如何快速查询到数组中到某个对象
发布于 5 年前 作者 tzbcf 4339 次浏览 来自 问答

列: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 实现,很简单

如果是高频使用场景,还是用数据库来实现吧。

回到顶部