使用“for in”循环和IndexOf()忽略对象中的未定义值

时间:2017-10-19 11:45:27

标签: javascript

所以,我需要找到searchSpace对象中包含query字符串中的子字符串的每个键/值。例如,密钥为3value1: '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中包含nullvalue。像这样:

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

当我应用searchSpaceIndeoOf()时,如何让我的代码忽略toLowerCase()中的未定义值?

3 个答案:

答案 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' }}