Изменение ключей объекта при переборе вложенного объекта - PullRequest
0 голосов
/ 17 января 2020

Я хочу провести l oop через вложенный объект и изменить каждый ключ (удалить первый символ).

Следующий код выполняет итерацию по всему объекту, но не изменяет ключ. Объект по-прежнему выглядит одинаково после запуска функции.

const removeFirstCharacterOfKey = (obj) => {
    Object.keys(obj).forEach((key) => {
        if (typeof obj[key] === 'object') {
            if(Array.isArray(obj[key])) {
                return;
            }
            return removeFirstCharacterOfKey (obj[key]);
        }
        key = key.substring(1);
    });
}

Возможно также создание нового объекта с измененными ключами. Можно ли этого добиться?

Ответы [ 2 ]

1 голос
/ 17 января 2020

https://codesandbox.io/embed/cool-golick-vdf6k?fontsize=14&hidenavigation=1&previewwindow=tests&theme=dark

Массив array.reduce - ваш лучший выбор здесь. Реализация Basi c в вашем случае будет

function serializer(obj) {
  return Object.entries(obj).reduce((obj, [key, entry]) => ({
      ...obj,
      [key.substr(1)]: entry
    }),{});
}

Однако у вас есть дополнительная проверка для массива, поэтому нам нужно изменить метод так, чтобы он принимал пользовательский модификатор

function serializer(obj, modifier) {
  return Object.entries(obj).reduce(
    (obj, [key, entry]) => ({
      ...obj,
      [modifier(key, entry)]: entry
    }),
    {}
  );
}

и использовал его как

const myObj = {
  $a: "hello a",
  $b: "hello b",
  $c: [],
  $d: "hello d",
  $e: "hello e"
};

function serializer(obj, modifier) {
  return Object.entries(obj).reduce(
    (obj, [key, entry]) => ({
      ...obj,
      [modifier(key, entry)]: entry
    }),
    {}
  );
}

const serialized = serializer(myObj, (key, entry) =>
  Array.isArray(entry) ? key : key.substr(1)
);

test("", () => {
  expect(serialized).toEqual({
    a: "hello a",
    b: "hello b",
    $c: [],
    d: "hello d",
    e: "hello e"
  });
});

1 голос
/ 17 января 2020

В вашем текущем коде вы никогда не изменяете существующий объект (или создаете новый объект), вы просто переназначаете параметр key, который не будет иметь побочных эффектов.

Попробуйте вместо этого использовать рекурсивную Object.fromEntries функцию отображения:

const obj = {
  foo: {
    bar: 'val',
    baz: {
      buzz: 'val',
      buzz2: 'val'
    }
  }
};

const objWithSlicedKeys = obj => Object.fromEntries(
  Object.entries(obj).map(
    ([key, val]) => [
      key.slice(1),
      typeof val === 'object' && val !== null ? objWithSlicedKeys(val) : val
    ]
  )
);
console.log(objWithSlicedKeys(obj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...