【问题标题】:Delete a key under a condition in Javascript object在Javascript对象中的条件下删除键
【发布时间】:2021-03-19 05:14:13
【问题描述】:

我需要编写一个 removeVowelKeys 函数,该函数接受一个对象并删除所有以元音开头的键。寄存器无关紧要。

例如,我有一个对象

const vowelsObj = {
  alarm: 'hello',
  chip: 100,
  isValid: false,
  Advice: 'Learn it hard',
  onClick: 'make it great again',
}

函数的工作结果应该是这样的:

vowelsObj === {
  chip: 100,
}

这是我已经写的

function removeVowelKeys(object) {
  const num = Object.keys(object);

  for( let i = 0; i < num.length; i++) {
    for (let key in object) {
    if (key.startsWith('a'||'e'||'i'||'o'||'u'||'y')) {
      delete object[key];
        }
    }
    }
    return object;
}

但它只删除以元音开头的第一个字段,其他字段保留。有什么想法可以做到吗?

【问题讨论】:

  • key.startsWith('a'||'e'||'i'||'o'||'u'||'y')) 这并不像你认为的那样,.. 'a'||'e'||'i'||'o'||'u'||'y' = 'a',IOW:你的代码可以 -> key.startsWith('a')
  • 在你的 if 语句中试试这个['a','e','i','o','u','y'].includes(key.charAt(0).toLowerCase())
  • 编程语言不像人类那样理解key.startsWith('a' || 'b' || 'c'),你应该把它翻译成key.startsWith('a') || key.startsWith('b') || key.startsWith('c');或者只是['a', 'b', 'c'].includes(key[0].toLowerCase());或者,如果您更喜欢更紧凑的方式const removeVowelKeys = object =&gt; Object.fromEntries(Object.entries(object).filter(pair =&gt; !['a','e','i','o','u','y'].includes(pair[0][0].toLowerCase()))),这行函数会将对象作为键值对进行破坏,然后过滤掉元音键,并返回一个新构造的对象

标签: javascript node.js loops object conditional-statements


【解决方案1】:

您可以使用正则表达式/^[aeiouy]/。正则表达式中的^ 匹配字符串的开头[aeiouy] 匹配aeiouy 之一。要匹配不区分大小写(忽略字符大小写),请添加 i 标志。例如。 /^[aeiouy]/i

const vowelsObj = {
  alarm: 'hello',
  chip: 100,
  isValid: false,
  Advice: 'Learn it hard',
  onClick: 'make it great again',
}

function removeVowelKeys(object) {
  for (let key in object) {
    if (key.match(/^[aeiouy]/)) {
      delete object[key];
    }
  }
  return object;
}


removeVowelKeys(vowelsObj);
console.log(vowelsObj);

我将removeVowelKeys 与您已有的类似。然而delete 改变了参数。如果您不想这样做,请将您想要的属性复制到新对象,而不是从原始对象中删除。

const copy = {};
for (let key in object) {
  if (!key.match(/^[aeiouy]/)) { // <- added ! to invert the if-statement
    copy[key] = object[key];
  }
}
return copy;

【讨论】:

    【解决方案2】:

    您只是在遍历不需要的键之外包含一个额外的 for 循环,使用 includes 将比为每个字符重复 startsWith 更有帮助。

    const vowelsObj = {
        alarm: 'hello',
        chip: 100,
        isValid: false,
        Advice: 'Learn it hard',
        onClick: 'make it great again',
    }
    
    function removeVowelKeys(object) {
        const updatedResult = Object.keys(object).reduce((updatedResult, key) => {
            const char = (typeof(key) === 'string' && key.trim().length > 0)? key.toLowerCase().charAt(0) : '';
            if (!['a', 'e' , 'i' ,'o' , 'u' ,'y'].includes(char)){
                updatedResult[key] = object[key];
            }
            return updatedResult;
        }, {})
        return updatedResult;
    }
    
    console.log(removeVowelKeys(vowelsObj));

    【讨论】:

      【解决方案3】:

      您必须为每个角色使用单独的.startsWith 调用。您还需要将键转换为小写以删除大写键。

      const vowelsObj = {
        alarm: 'hello',
        chip: 100,
        isValid: false,
        Advice: 'Learn it hard',
        onClick: 'make it great again',
      }
      
      function removeVowelKeys(object) {
        const num = Object.keys(object);
      
        for( let i = 0; i < num.length; i++) {
          for (let key in object) {
            const lowercaseKey = key.toLowerCase()
            if (
              lowercaseKey.startsWith('a') || lowercaseKey.startsWith('e')
                || lowercaseKey.startsWith('i') || lowercaseKey.startsWith('o')
                || lowercaseKey.startsWith('u') || lowercaseKey.startsWith('y')
            ) {
              delete object[key];
            }
          }
        }
          return object;
      }
      
      console.log(
        removeVowelKeys(vowelsObj)
      )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2018-04-20
        • 2021-02-14
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多