Как осуществить изменение объекта?

Как исправить код, чтобы объект `desktopData.value.orders` содержал один массив с элементами из массивов `tools` и `wood`, присвоив каждому элементу поле `type` соответствующее названию массива?

Моя текущая реализация:

```javascript
desktopData.value = response.data.data

desktopData.value?.orders.tools.forEach((item) => (item.type = 'tools'))

desktopData.value?.orders.wood.forEach((item) => (item.type = 'wood'))

desktopData.value.orders = desktopData.value?.orders.tools.concat(
  desktopData.value?.orders.wood,
)
```

Однако `desktopData.value.orders` не выводится. В чем ошибка и есть ли более эффективное решение?
  • 7 ноября 2023 г. 9:58
Ответы на вопрос 2
Ошибки в вашем коде:

1. У вас нет проверки на наличие массива `tools` и `wood` в `desktopData.value.orders`. Поэтому нужно предусмотреть эту проверку перед выполнением операций над этими массивами.

2. Вместо присваивания значения `desktopData.value.orders` вы должны объединить массивы `tools` и `wood` с помощью оператора объединения массивов `concat`, как вы уже сделали.

3. Вы используете условный оператор опциональной цепочки `?.`, чтобы избежать ошибки, если `desktopData.value` не существует, но вы также должны проверить наличие `orders`, `tools` и `wood`.

Вот исправленный код:

```javascript
desktopData.value = response.data.data

if (desktopData.value?.orders?.tools) {
  desktopData.value.orders.tools.forEach((item) => (item.type = 'tools'))
}

if (desktopData.value?.orders?.wood) {
  desktopData.value.orders.wood.forEach((item) => (item.type = 'wood'))
}

if (desktopData.value?.orders?.tools && desktopData.value?.orders?.wood) {
  desktopData.value.orders = desktopData.value.orders.tools.concat(
    desktopData.value.orders.wood
  )
}
```

Это более безопасный подход, который проверяет наличие всех необходимых свойств перед выполнением операций. Если одно из свойств отсутствует, то соответствующая операция не будет выполнена.
Код, который я уже написал, работает. Однако, его можно немного улучшить.

```
var o = {
    value: {
        orders: {
            tools: [
                {
                    tool1: 't1'
                }
            ],
            wood: [
                {
                    wood1: 'w1',
                }
            ],
        },
    }
}

var allOrders = [];
var ordersByType = o.value?.orders || {};

Object.keys(ordersByType).forEach((type) => {
    ordersByType[type].forEach((order) => {
        allOrders.push({
            ...order,
            type,
        });
    });
});

o.value.orders = allOrders;
```

Можно использовать метод `reduce` для экономии нескольких строк кода, однако многие считают, что использование этого метода может ухудшить читаемость кода.
Похожие вопросы