Как в копии объекта убрать ненужные символы в ключах
Мне нужно сделать поверхностную копию объекта, но у копии в ключах нужно убрать симовл "_".Можно это ещё как-то сделать кроме как исполтзовать перебор через for in и в нём через split разбивать ключи забирая первый элемент? (Object.assign, но там нужно вручную менять ключи)
let recepie = {
cooking_time: 45
id: "5ed6604591c37cdc054bc886"
image_url: "http://forkify-api.herokuapp.com/images/FlatBread21of1a180.jpg"
ingredients:
(7)[{…}, {…}, {…}, {…}, {…}, {…}, {…}]
publisher: "My Baking Addiction"
servings: 4
source_url: "http://www.mybakingaddiction.com/spicy-chicken-and-pepper-jack-pizza-recipe/"
title: "Spicy Chicken and Pepper Jack Pizza"
}
let copyRecipe = {
id: recipe.id,
image: recipe.image_url,
title: recipe.title,
ingredients: recipe.ingredients,
publisher: recipe.publisher,
servings: recipe.servings,
sourceUrl: recipe.source_url,
cookingTime: recipe.cooking_time,
}
введите сюда код
Ответы (2 шт):
Вот несколько способов перебрать ключи объекта и убрать _(подчеркивание).
Каждый из них проверяет символ подчеркивания в ключах и при нахождении удаляет.
let recepie = {
cooking_time: 45,
id: "5ed6604591c37cdc054bc886",
image_url: "http://forkify-api.herokuapp.com/images/FlatBread21of1a180.jpg",
ingredients: [],
publisher: "My Baking Addiction",
servings: 4,
source_url: "http://www.mybakingaddiction.com/spicy-chicken-and-pepper-jack-pizza-recipe/",
title: "Spicy Chicken and Pepper Jack Pizza",
}
function replacer(obj) {
return Object.entries(obj).reduce((acc, val) => {
val[0] = val[0].replace('_', '');
acc[val[0]] = val[1];
return acc;
}, {})
}
console.log(replacer(recepie))
function replaceEach(obj) {
const res = {};
Object.entries(obj).forEach(item => {
res[item[0].replace('_', '')] = item[1]
})
return res;
}
console.log(replaceEach(recepie))
function maper(obj) {
return Object.fromEntries(Object.entries(obj).map(item => {
item[0] = item[0].replace('_', '');
return item;
}))
}
console.log(maper(recepie))
Замеров я не делал, скорее всего forEach окажется самым быстым для выполнения данной задачи.
Все возвращают "новый" объект, не мутирая исходный
UPD: Из замечаний в комментариях. Если ключи нужны в camelCase, то можно к ключам применять фукнцию:
function toGorbatiy(keyName) {
const id = keyName.indexOf('_');
if (id === -1) return keyName;
if (!id) return keyName.slice(1)
return keyName.slice(0, id) + keyName.charAt(id+1).toUpperCase() + keyName.slice(id + 2);
}
Вызовы будут выглядеть так
function replacer(obj) {
return Object.entries(obj).reduce((acc, val) => {
acc[toGorbatiy(val[0])] = val[1];
return acc;
}, {})
}
function replaceEach(obj) {
const res = {};
Object.entries(obj).forEach(item => {
res[toGorbatiy(item[0])] = item[1];
})
return res;
}
function maper(obj) {
return Object.fromEntries(Object.entries(obj).map(item => {
item[0] = toGorbatiy(item[0]);
return item;
}))
}
Понадобится две функции: одна преобразует строку snake_case в camelCase. Вторая перебирает все ключи объекта, преобразует их, составляет новый объект:
const camelCase = s => s.replace(/(_.)/g, match => match[1].toUpperCase());
const camelCaseKeys = obj => Object.fromEntries(Object.entries(obj).map(
([key, value]) => [camelCase(key), value]
));
console.log(camelCaseKeys({
cooking_time: 45,
id: "5ed6604591c37cdc054bc886",
image_url: "http://forkify-api.herokuapp.com/images/FlatBread21of1a180.jpg",
ingredients: ['ingredients', 'are', 'here'],
publisher: "My Baking Addiction",
servings: 4,
source_url: "http://www.mybakingaddiction.com/spicy-chicken-and-pepper-jack-pizza-recipe/",
title: "Spicy Chicken and Pepper Jack Pizza"
}));