循环遍历一个对象数组,并获取object.field等于value的位置

时间:2017-04-08 12:43:57

标签: javascript arrays performance loops

我目前正在开发一个小型应用程序,我必须遍历大量的对象。什么是最有效的方法来执行此操作?

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

我想让每个对象name等于"Alpha"。我目前正在使用一个简单的if语句来过滤具有不同name值的对象,但我想知道是否有更高效的方法来执行此操作,性能方面。

值得一提的是,我会将匹配结果推送到新数组中。

4 个答案:

答案 0 :(得分:1)

不,没有更有效的方式。

另一种方法是构建和维护某种内部数据结构,使您能够更快地找到所需的元素。像往常一样,权衡取决于维持这种结构所涉及的工作与保存你的时间之间的关系。

答案 1 :(得分:0)

我没有办法知道哪种方式更有效。

但是如果您按名称排序对象,则可以在到达名称不等于“Alpha”的对象时立即停止搜索。

要查找您要查找的第一个对象,您可以使用二进制搜索,然后从此对象上下移动,直到两端都到达一个未命名为“Alpha”或数组末尾的对象。 / p>

这只是一种优化方式,需要时间对数组进行排序,并且在添加元素时也需要更多时间。

答案 2 :(得分:0)

这种任务完全有一个JavaScript函数。 过滤

来自文档

  

filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

以下是一个代码示例,用于从数组中获取具有特定“名称”字段的所有元素:

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;
  });
}

答案 3 :(得分: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; }