2017-04-08 87 views
-1

我目前正在一个小的应用程序,我必须通过一个巨大的对象循环。什么是最有效的方法来执行此操作?循环遍历一个对象数组,并得到的地方object.field等于值

var array = [ 
    { 
    id: "1", 
    name: "Alpha" 
    }, 
    { 
    id: "2", 
    name: "Beta" 
    }, 
    ... 
]; 

我想获得其中name等于"Alpha"每个对象。我目前使用一个简单的if语句过滤不同的name值的对象,但我想知道是否有更高效的方式来执行此操作,性能明智。

值得一提的是我会推匹配结果到一个新的数组。

+0

显示你在做什么,你可以用户'filter'或'map'取决于你真正想做的事, – funcoding

+0

@Tomalak巨大的潜在万多对象。我当前的代码没有问题,我只是问是否有更有效的方法来过滤所需的对象。 – Enzio

回答

1

不,没有更有效的方法。

另一种方法是建立和保持某种内部数据结构的哪个可以找到所需的元素更快。像往常一样,权衡是维持这种结构的工作与节省您的时间之间的关系。

0

我没有任何办法,对此,我会知道这是更有效的。

但是,如果你有按名称排序你的对象,你可以在到达一个对象,它的名字不等于“阿尔法” imideatly停止搜索。

要找到你要找的,你可以使用二进制搜索,并从这个对象,你去向上和向下,直到两端到达未命名为“阿尔法”的对象或数组末尾的第一个对象。

这是优化的唯一的方法,并且将需要的时间来对数组进行排序,并且还添加元素时会花费更多的时间。

0

这种类型的任务完全有JavaScript功能。 过滤

从文档

的过滤器()方法创建与通过由提供的功能实现的测试中所有元素的数组。

这里是一个小例子,通过代码正从阵列具有一定的“名称”字段中的所有元素:

const arr = [ 
 
    {name: 'Abc'}, 
 
    {name: 'Xyz'}, 
 
    {name: 'Lmn'}, 
 
    {name: 'Xyz'}, 
 
    {name: 'Xyz'} 
 
]; 
 

 
let response = findByName('Xyz'); 
 
console.log(response); 
 

 
function findByName (name) { 
 
    return arr.filter((element) => { 
 
    return element.name = name; 
 
    }); 
 
}

0

如果你需要一次以上的集合用一个给定的名字,你可以使用一个名称为哈希的对象,并立即访问这些项目。

var array = [{ id: "1", name: "Alpha" }, { id: "2", name: "Beta" }, { id: "3", name: "Beta" }, { id: "4", name: "Gamma" }, { id: "5", name: "Beta" }, { id: "2", name: "Alpha" }], 
 
    hash = Object.create(null); 
 
    
 
array.forEach(function (a) { 
 
    if (!hash[a.name]) { 
 
     hash[a.name] = []; 
 
    } 
 
    hash[a.name].push(a); 
 
}); 
 

 
console.log(hash);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

@Kinduser,将所有名称分组到自己的数组是不同的。通过使用名称作为对象的关键字,速度随后快速访问。 –