У меня есть эта структура объекта:
"users": {
"1": {
"id": 1,
"name": "John",
"email": "[email protected]",
"supplier_id": 1,
"supplier_name": [
"Supplier1"
],
"supplier_code": "SUP001",
"count": "21"
}
}
Я хотел бы изменить его, чтобы он выглядел так:
"users": {
"1": {
"id": 1,
"name": "John",
"email": "[email protected]",
"suppliers":[
{
"supplier_id": 1,
"supplier_name": [
"Supplier1"
]
}
],
"supplier_code": "SUP001",
"count": "21"
}
}
Я попробовал это, надеясь, что это сработает:
const group = accumulator[item.id];
group.suppliers = [];
group.suppliers = group.suppliers.push(item.supplier_name, item.supplier_id, item.supplier_code);
return accumulator;
К сожалению, это просто дает мне количество объектов, помещенных в suppliers, suppliers не является массивом, а supplier_id, supplier_name и supplier_code все еще видны за пределами suppliers:
"users": {
"1": {
"id": 1,
"name": "John",
"email": "[email protected]",
"supplier_id": 1,
"supplier_name": [
"Supplier1"
],
"supplier_code": "SUP001",
"count": "21",
"suppliers: 3
}
}
Как изменить его на нужный мне формат?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно использовать object, чтобы вставить в массив suppliers. Также удалите старые ключи, которые не нужны.
Редактировать - Вы можете напрямую создать массив из 1 объекта. Спасибо @Адам
const group = accumulator[item.id];
group.suppliers = [{
supplier_id: item.supplier_id,
supplier_name: item.supplier_name,
supplier_code: item.supplier_code
}];
delete group.supplier_id;
delete group.supplier_name;
delete group.supplier_code;
return accumulator;
Вот быстрое и современное решение:
const parseUsers = (users) => {
let parsedUsers = {};
for (key in users) {
const user = users[key];
// destructuring (or extracting) the relevant keys from the . user object, keeping everything else under 'rest'
const { supplier_id, supplier_name, ...rest } = user;
parsedUsers[key] = {
...rest, // spreading back our rest params
suppliers: [ // creating a new array and populating it with the keys which we previously extracted (along with their corresponding values)
supplier_id,
supplier_name
]
}
}
return parsedUsers;
}
использование: parseUsers(json.users)
Вы можете использовать es6 Назначение деструктурирования, Объект.значения es2017 (или вместо этого Object.keys).
Если вы предполагаете, что users содержит более одного пользователя, вы можете использовать уменьшать.
В приведенном ниже примере исходный объект не будет изменен.
Надеюсь, поможет
const original = {
"users": {
"1": {
"id": 1,
"name": "John",
"email": "[email protected]",
"supplier_id": 1,
"supplier_name": [
"Supplier1"
],
"supplier_code": "SUP001",
"count": "21"
}
}
};
const { users } = original;
const reshaped = Object.values(users).reduce((acc, { id, supplier_id, supplier_name, ...rest }) => {
acc[id] = {
...rest,
suppliers: [{
supplier_id,
supplier_name: [supplier_name]
}]
};
return acc;
}, {});
console.info(reshaped);
.pushизменяет исходный объект и возвращает его новую длину, поэтому вам не нужен оператор присваивания, и вы можете просто сделать:group.suppliers.push(item.supplier_name, item.supplier_id, item.supplier_code);