如何通过对象属性在对象数组中查找对象?

时间:2015-03-10 11:00:41

标签: javascript jquery

我有一些对象。在每个对象中,我都有属性ID。

for(var i=0;i<listItems.length;i++){
            if(listItems[i].id==5){
                var selectedDataEdit=JSON.stringify(listItems[i]);
            }
        }

我想找到id = 5的对象。现在我用循环来做。但这是一个漫长的过程。有没有办法没有循环呢?

5 个答案:

答案 0 :(得分:1)

这实际上取决于您的具体需求,因此我们需要更多信息(为什么这是一个漫长的过程?这个过程的目标是什么?)一个好的答案,但一个非常简单的方法是创建另一个数组,其中索引是id(假设id是唯一的)。

var listItemsById = [];
for(var i=0;i<listItems.length;i++){
    listItemsById[listItems[i].id] = listItems[i];
}

在此之后,您可以使用listItemsById快速访问ID,同时仍然保留原始listItems(因为listItemsById中的项目仅是对原始文件的引用)。

更新:由于我看到有几个人建议使用.filter(或等效的),我认为需要明确的事情之一,如 Andy指出,有(至少)两种方法可以将原始代码视为“漫长过程”:

<强> 1。这需要你(相对)很长的时间来写(或者在看的时候不是很清楚)

如果您担心这一点,那么.filter是一个干净的解决方案,但请记住, 执行速度更快(实际上可能是slower than using a loop },但这是依赖于实现的)。它仍将在内部使用某种循环,如果你编写了自己的函数,你会得到相同的结果,例如:

function findById(items, id) {
    for(var i=0; i<items.length; i++){
        if (items[i].id==id){
            return items[i];
        }
    }
}

// example call
var selectedDataEdit=JSON.stringify(findById(listItems, 5));

<强> 2。执行

需要很长时间

如果是这种情况,那么您需要提供有关使用的更多信息。虽然我最初提供的解决方案会更快,但它非常一般,在您的特定情况下可能不是一个好主意(或者甚至可能不适用)。

答案 1 :(得分:0)

您可以使用jquery .filter()函数:

JSON.stringify(listItems.filter(function(){
   return this.id==5;
}))

答案 2 :(得分:0)

我通常使用lo-dash进行这些类型的操作。您可能会发现这个库很有用。在你的情况下,我会使用_.findWhere

https://jsfiddle.net/cfcef9nu/2/

答案 3 :(得分:0)

循环涉及多长时间?写吗?处理元素需要太长时间?也许你可以重新组织你的数据结构来帮助解决这个问题,正如fstan所建议的那样,使用id作为对象中的键,但是如果你想使用数组,那么循环总是必要的。

filter :正如其他人提到的那样filter是一个合理的选择。但是,如果您决定使用此方法,则需要了解filter返回数组,因此您需要一个返回该数组的第一个元素的函数,在您的情况下,该元素的字符串化版本。

function findById(arr, id) {
  var result = arr.filter(function (el) { return el.id === id; });
  return JSON.stringify(result[0]);
}

findById(arr, 5); // "{"id":3,"no":32}"

DEMO

答案 4 :(得分:-1)

这可能会成功

var item = listItems.filter(function (e) {if (e.id == 5) return JSON.stringify(e);});

希望它有用