Удалить ключ при условии в объекте Javascript

#javascript #node.js #loops #object #conditional-statements

#javascript #node.js #циклы #объект #условные операторы

Вопрос:

Мне нужно написать функцию 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;
}
 

но он удаляет только первое поле, которое начинается с гласной, а остальные остаются. Есть идеи, как это можно сделать?

Комментарии:

1. key.startsWith('a'||'e'||'i'||'o'||'u'||'y')) Это не делает того, что вы думаете, что он делает, .. 'a'||'e'||'i'||'o'||'u'||'y' = 'a' , IOW: ваш код делает -> key.startsWith('a')

2. Попробуйте это ['a','e','i','o','u','y'].includes(key.charAt(0).toLowerCase()) в вашем операторе if.

3. Язык программирования не понятен key.startsWith('a' || 'b' || 'c') как человеческий, вы должны перевести его в key.startsWith('a') || key.startsWith('b') || key.startsWith('c') ; Или просто ['a', 'b', 'c'].includes(key[0].toLowerCase()) ; Или, если вы предпочитаете более компактный способ const removeVowelKeys = object => Object.fromEntries(Object.entries(object).filter(pair => !['a','e','i','o','u','y'].includes(pair[0][0].toLowerCase()))) , эта строка функции уничтожит объект как пару ключ-значение, затем просто отфильтрует ключ, который является гласным, и вернет новый созданный объект

Ответ №1:

Вы могли бы использовать регулярное /^[aeiouy]/ выражение. Совпадение ^ в регулярном выражении с началом строки [aeiouy] соответствует одному из a , e , i , o , u , или y . Чтобы соответствовать регистру, чувствительному к регистру (игнорировать символьный регистр), добавьте 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 for для каждого символа.

 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' amp;amp; key.trim().length > 0)? key.toLowerCase().charAt(0) : '';
        if (!['a', 'e' , 'i' ,'o' , 'u' ,'y'].includes(char)){
            updatedResult[key] = object[key];
        }
        return updatedResu<
    }, {})
    return updatedResu<
}

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)
)