2017-10-19 80 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' }}