2017-05-26 78 views
0

我具有類似於這種結構的對象數組:循環遍歷對象在Arrray每個屬性

array = [ 
    {name: "Alex", content: "Lorem"}, 
    {name: "Bob", content: "Lorem"} 
    ... 
] 

這個陣列被映射到HTML表格。我試圖建立搜索方法,它會比較對象的每個屬性,並返回這些包含單詞,我正在尋找。我已經建立了方法,這是工作。

if(search_word){ 
    licenses = licenses.filter((item) => { 
     if(item.name.toLowerCase().indexOf(search_word.toLowerCase()) !== -1){ 
      return item; 
     } 
    }) 
} 

它工作正常,但我需要逐個指定每個對象屬性名稱。我希望有一些更具普遍性的地方,它會遍歷所有的屬性名稱。我已經用方法試過了:

for(let property in item) 

但是對我不起作用。你能建議一些事情嗎?啊,我想避免jQuery。

乾杯, 丹尼爾

+0

應該是什麼樣子的結果是什麼樣子?你只想找到第一個? –

+0

現在,如果名稱屬性中包含搜索詞,它將返回項目。我還想在內容屬性中進行搜索。重點是,我有更多的屬性,所以我需要一些自動方法來搜索對象的每個可能的屬性。 –

回答

2

你可以使用someObject.keys這樣的:

if(search_word){ 
    let l_search_word = search_word.toLowerCase(); 
    licenses = licenses.filter(item => 
     Object.keys(item).some(key => 
      item[key].toLowerCase().indexOf(l_search_word) !== -1 
     ) 
    ) 
} 

相反的indexOf,你也可以使用includes

item[key].toLowerCase().includes(l_search_word) 
+0

非常感謝。 'item [key] .toLowerCase不是函數'。我得到這個錯誤,但可能我會解決它我自己:)。 –

+0

看起來這是最好的解決方案。肯定是最快的。只有一件事。在使用toLowerCase函數之前,它需要將item [key]解析爲字符串'item [key] .toString()。toLowerCase()。indexOf(l_search_word)!== -1' –

+0

'item [鍵]'不是一個字符串。在你的問題中,有人建議他們是字符串。無論如何,要注意'toString',是否會導致你不感興趣的匹配。例如,如果'item [key]'是一個數組,那麼'toString'會產生一個帶逗號的字符串,如果你的搜索字符串有一個逗號,可能會導致你沒有想到的匹配。 – trincot

2

你爲什麼不只是字符串化完整的對象

if(search_word){ 
    licenses = licenses.filter((item) => { 
     if(JSON.stringify(item).toLowerCase().indexOf(search_word.toLowerCase()) !== -1){ 
      return item; 
     } 
    }) 
} 

將是一次有效的,如果你的對象是面積很大,也這樣,你就不會需要檢查所有的屬性。

它會錯過的一件事是,如果有人搜索namecontent那麼一切都會出現。

+0

非常棒!開箱即用:D。有趣的是,它也在屬性名稱中進行搜索,但不是全部:D。 –