[英]How to find object in array of object by object property?
我有對象的數組。 在每個對象中,我都有屬性ID。
for(var i=0;i<listItems.length;i++){
if(listItems[i].id==5){
var selectedDataEdit=JSON.stringify(listItems[i]);
}
}
我想找到id = 5的對象。 現在我使用循環來做。 但這是一個漫長的過程。 有沒有辦法做到沒有循環?
這確實取決於您的特定需求,因此我們需要更多信息(為什么要花很長時間?這個過程的目標是什么?),但是一個非常簡單的方法是創建另一個索引所在的數組。 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
是一個干凈的解決方案,但請記住,這不是更快的執行(它可能,事實上,是比使用一個循環較慢 ,但這是依賴於實現)。 它仍然會在內部使用某種循環,並且如果您編寫自己的函數,您將得到相同的結果,例如:
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.執行時間長
如果是這種情況,那么您需要提供有關使用的更多信息。 雖然我最初提供的解決方案會更快,但是它非常籠統,在您的特定情況下可能不是一個好主意(甚至可能不適用)。
您可以使用jquery .filter()
函數:
JSON.stringify(listItems.filter(function(){
return this.id==5;
}))
我通常將lo-dash用於此類操作。 您可能會發現此庫有用。 在您的情況下,我將使用_.findWhere
。
循環涉及什么漫長的過程? 寫嗎 處理這些元素需要太長時間嗎? 正如fstanis所建議的那樣,也許您可以重組數據結構以幫助實現此目的,方法是使用id作為對象中的鍵,但是如果要使用數組,則總是需要循環。
關於filter
:正如其他人提到的, filter
是一個合理的選擇。 但是,如果決定使用此方法,則需要了解filter
返回一個array ,因此您需要一個函數來返回該數組的第一個元素,以及返回該元素的字符串化版本的函數。
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}"
這可能會解決問題
var item = listItems.filter(function (e) {if (e.id == 5) return JSON.stringify(e);});
希望它能工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.