簡體   English   中英

如何通過對象屬性在對象數組中查找對象?

[英]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

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

循環涉及什么漫長的過程? 寫嗎 處理這些元素需要太長時間嗎? 正如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM