Изменение значений ключей в массиве объектов

Сделал функцию, которая заменяет ключи

var workers = [
    {
        name : 123,
        lastname : 'ivanov'
    },
    {
        name : 'ivan',
        lastname: 'borisov'
    }
];

function touppercase (array){
    array.forEach(function (obj) {
        for (var key in obj) {
            if (typeof obj[key] === "string") {
                obj[key.toUpperCase()] = obj[key];
                delete obj[key];
            }
        }
    });
}


touppercase(workers);
console.log(workers);//{ name: 123, LASTNAME: 'ivanov' },{ NAME: 'ivan', LASTNAME: 'borisov' }


Как можно изменить значения ключей так же, например сделать их с заглавным регисторм? Я решил это вот так, но если ключей будет много или значение ключа будет не строка, а число, то функция не работает. Как можно упростить чтобы не перечислять каждый и не изменять его?

var workers = [
    {
        name : 'maxim',
        lastname : 'ivanov'
    },
    {
        name : 'ivan',
        lastname: 'borisov'
    }
];


function namestoupper(...args) {
    for (var i=0; i < args.length; i++) {
        if (typeof (args[i].name , args[i].lastname) === "string") {
            args[i].name = args[i].name.toUpperCase();
            args[i].lastname = args[i].lastname.toUpperCase();
        }
    }
}

namestoupper(...workers);
console.log(workers); // { name: 'MAXIM', lastname: 'IVANOV' }, { name: 'IVAN', lastname: 'BORISOV' }

Ответы (2 шт):

Автор решения: Aleksey

Object.keys() возвращает массив из собственных перечисляемых свойств переданного объекта, в том же порядке

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Пример

testObj = {
    1: '123',
    true: '123',
    'asd': '123',
}
console.log(Object.keys(testObj));
→ Ссылка
Автор решения: Максим Вишневский

Ключами в Object в JS могут быть только строки (даже если вы используете другой тип в качестве ключа, то на выходе он преобразуется в строку), в отдельных случаях возможно использование Symbol, но данный тип не выводится методом Object.keys() и другими итераторами, так как они игнорируются при итерации. Поэтому проверка if (typeof key === "string") попросту ненужна.

Что касается вашей задачи, то было бы хорошо обойтись без мутации и сделать примерно так:

const workers = [
  { name: 'Nick', lastName: 'First', 1: 1 },
  { name: 'Nicky', lastName: 'Second', [Symbol()]: 'some text' },
];

const stringKeysToUpperCase = (items) => items
  .map((item) => Object.keys(item).reduce((acc, key) => {
    acc[key.toUpperCase()] = item[key];
    return acc;
  }, {}));

/**
 * Результат (Symbol не попадает в итерацию, поэтому в результате его нет):
 * 
 * [
 *   { '1': 1, NAME: 'Nick', LASTNAME: 'First' },
 *   { NAME: 'Nicky', LASTNAME: 'Second' }
 * ]
 */
console.log(stringKeysToUpperCase(workers));
→ Ссылка