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