Изменить структуру объекта JavaScript

У меня есть эта структура объекта:

"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
        }
}

Как изменить его на нужный мне формат?

.push изменяет исходный объект и возвращает его новую длину, поэтому вам не нужен оператор присваивания, и вы можете просто сделать: group.suppliers.push(item.supplier_name, item.supplier_id, item.supplier_code);
silicakes 13.05.2019 18:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно использовать 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);

Другие вопросы по теме