#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
}, [])
)