我有一些对象。在每个对象中,我都有属性ID。
for(var i=0;i<listItems.length;i++){
if(listItems[i].id==5){
var selectedDataEdit=JSON.stringify(listItems[i]);
}
}
我想找到id = 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
。
答案 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}"
答案 4 :(得分:-1)
这可能会成功
var item = listItems.filter(function (e) {if (e.id == 5) return JSON.stringify(e);});
希望它有用