Изменение ключей вложенного объекта в массиве с помощью JavaScript

#javascript #nested-loops

Вопрос:

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

 let myArray = [
  {
    id: 1,
    name: "foo",
    Organization: [{ team: "value1" }, { location: "value2" }],
  },
  {
    id: 2,
    name: "foo",
    Organization: [{ team: "value1" }, { location: "value2" }],
  },
];
 

Я могу изменить ключи внешнего массива следующим образом, если захочу изменить id на userId .

 const newArray = myArray.map((item) => {
  return {
    userId: item.id,
  };
});
 

Но попытка изменить ключи во внутреннем списке объектов для Organization становится проблемой. Каков наилучший способ изменения внутренних ключей?

Комментарии:

1. Что вы пробовали? Что произойдет, когда вы попробуете это сделать?

2. Нет никакой разницы между «внутренним» и «внешним» массивом. Массив есть массив.

Ответ №1:

Вариант 1 — Ключи карты lodash

 import { mapKeys } from 'lodash';

const newArray = myArray.map(item => ({
  ...item,
  Organization: item.Organization.map(org =>
    mapKeys(org, (_, key) => (key === 'team' ? 'teamName' : key))
  ),
}));
 

Вариант 2 — уничтожение объекта

Вы можете уничтожить каждую Organization и восстановить ее с teamName помощью , пока team она существует.

 const newArray = myArray.map(item => ({
  ...item,
  Organization: item.Organization.map(({ team, ...rest }) =>
    Object.assign(rest, team ? { teamName: team } : {})
  ),
}));
 

Результат

 [
  {
    id: 1,
    name: 'foo',
    Organization: [{ teamName: 'value1' }, { location: 'value2' }],
  },
  {
    id: 2,
    name: 'foo',
    Organization: [{ teamName: 'value1' }, { location: 'value2' }],
  },
];
 

Ответ №2:

If Organization -это всегда массив из 2 элементов. Где первый элемент-это объект со свойством team , а второй элемент-объект со свойством location . Затем следующий код выполняет свою работу.

 let myArray = [{
  "id": 1,
  "name": "foo",
  "Organization": [{"team": "value1"}, {"location": "value2"}]
}, {
  "id": 2,
  "name": "foo",
  "Organization": [{"team": "value1"}, {"location": "value2"}]
}];

const result = myArray.map((item) => {
  const [{ team: teamName }, location] = item.Organization;
  return { ...item, Organization: [{ teamName }, location] };
});

console.log(result); 

В этом ответе используется назначение деструктурирования. Если вы не знаете, что это такое, я бы настоятельно рекомендовал ознакомиться со связанной документацией.

Ответ №3:

Не мог бы сделать это проще.

 console.log(
  [{
      "id": 1,
      "name": "foo",
      "Organization": [{
        "team": "value1"
      }, {
        "location": "value2"
      }]
    },
    {
      "id": 2,
      "name": "foo",
      "Organization": [{
        "team": "value1"
      }, {
        "location": "value2"
      }]
    },
  ].reduce((a, b) => {
    b.Organization[0] = {
      teamName: b.Organization[0].team
    }
    a.push(b)
    return a
  }, [])
)