2017-10-19 76 views
0

忽略對象中的未定義值因此,我需要找到包含query字符串中子字符串的searchSpace對象中的每個鍵/值。例如,密鑰是3,value1: '123abc'。它應該找到每個包含query = '3'的鍵/值。 這是我的代碼:使用「for in」循環和IndexOf()

for (let key in searchSpace) { 
    if (key.toLowerCase().indexOf(query.toLowerCase()) !== -1 || 
    searchSpace[key].value1.toLowerCase().indexOf(query.toLowerCase()) !== -1 || 
    searchSpace[key].value2.toLowerCase().indexOf(query.toLowerCase()) !== -1) { 
     // do something, not the case 
    } 
} 

它的工作原理。但我的對象應該能夠包含undefinednullvalue。就像這樣:

searchSpace['1'] = { value1: 'loremipsum', value2: '12345' }; 
searchSpace['2'] = { value2: 'ABCD' }; // here, value1 is undefined 
searchSpace['3'] = { value1: '123abc', value2: 'ABCD' }; 

如何使我的代碼忽略searchSpace不定值當我申請IndeoOf()toLowerCase()

回答

0

嘗試:

if (searchSpace[key].value1 && searchSpace[key].value1.toLowerCase().indexOf(query.toLowerCase()) !== -1){ ... } 

這將首先評估searchSpace[key].value1。如果它爲空或未定義,它不會嘗試.toLowerCase().indexOf(),所以您不會收到任何錯誤。

+0

TY,完全忘了null和undefined是「falsy」:D – VELFR

0

檢查,然後再存在的鑰匙,如果它們包含查詢

for (let key in searchSpace) { 
    if (key.toLowerCase().indexOf(query.toLowerCase()) !== -1 || 
    (searchSpace[key].value1 && 
    searchSpace[key].value1.toLowerCase().indexOf(query.toLowerCase()) !== -1)) || 
    (searchSpace[key].value2 && 
    searchSpace[key].value2.toLowerCase().indexOf(query.toLowerCase()) !== -1)) { 
     // do something, not the case 
    } 
} 
0

我喜歡的對象轉換成數組整齊迭代: 隨着多次迭代:

Object.keys(searchSpace) 
    .map(key => searchSpace[key]) // make array of objects 
    .filter(({value1, value2}) => 
    value1 && value2 && 
    value1.includes(query) || 
    value2.includes(query)) // leave only needed values 
    .forEach(obj => { 
    // Do something with results. 
    }) 

或者,如果你需要創建新的過濾的對象,我們可以用一個迭代使其+減少。將僅將對象與包含value1的結果組合在一起。

Object.keys(searchSpace).reduce((total, key) => { 
    const obj = searchSpace[key]; 
    if (!obj.value1) return total. 
    total[key] = obj; 
    return total; 
}, {}) 
// {1: { value1: 'loremipsum', value2: '12345' }, 2: { value1: '123abc', value2: 'ABCD' }}