所以,我需要找到searchSpace
对象中包含query
字符串中的子字符串的每个键/值。例如,密钥为3
,value1: '123abc'
。它应该找到包含query = '3'
的每个键/值。
这是我的代码:
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
}
}
有效。但我的对象应该能够在undefined
中包含null
或value
。像这样:
searchSpace['1'] = { value1: 'loremipsum', value2: '12345' };
searchSpace['2'] = { value2: 'ABCD' }; // here, value1 is undefined
searchSpace['3'] = { value1: '123abc', value2: 'ABCD' };
当我应用searchSpace
或IndeoOf()
时,如何让我的代码忽略toLowerCase()
中的未定义值?
答案 0 :(得分: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
}
}
答案 1 :(得分:0)
尝试:
if (searchSpace[key].value1 && searchSpace[key].value1.toLowerCase().indexOf(query.toLowerCase()) !== -1){ ... }
这将首先评估searchSpace[key].value1
。如果它为null或未定义,则不会尝试.toLowerCase()
或.indexOf()
,因此您不会收到任何错误。
答案 2 :(得分: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' }}