Изменение значений ключей в массиве объектов
Сделал функцию, которая заменяет ключи
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 шт):
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));