Как в копии объекта убрать ненужные символы в ключах

Рейтинг: 1Ответов: 2Опубликовано: 21.02.2023

Мне нужно сделать поверхностную копию объекта, но у копии в ключах нужно убрать симовл "_".Можно это ещё как-то сделать кроме как исполтзовать перебор через 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,
    }
В 3х ключах оригинального объекта присутствует символ "_":image_url,source_url,cooking_time,введите сюда код

Ответы

▲ 1Принят

Вот несколько способов перебрать ключи объекта и убрать _(подчеркивание).

Каждый из них проверяет символ подчеркивания в ключах и при нахождении удаляет.

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;
  }))
}
▲ 1

Понадобится две функции: одна преобразует строку 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"
}));