Как можно добавить новое поле в объект, включая вложенные объекты?

Как можно добавить к каждому объекту массива поле disabled, которое будет зависеть от выбранного device_type_id? В массиве содержатся объекты с вложенными объектами, у некоторых из них могут быть дополнительные вложенные объекты и так далее по вложенности. Ниже представлен пример исходного массива для более детального понимания задачи.
  • 24 мая 2024 г. 7:31
Ответы на вопрос 2
Для добавления нового поля в объект, включая вложенные объекты, можно воспользоваться рекурсивной функцией. Вот пример кода на JavaScript, который добавляет новое поле "newField" во все объекты, включая вложенные:

```javascript
const data = {
    id: 1,
    name: 'John',
    age: 30,
    address: {
        city: 'New York',
        street: 'Broadway'
    }
};

function addField(obj, field, value) {
    obj[field] = value;
    for (let key in obj) {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
            addField(obj[key], field, value);
        }
    }
}

addField(data, 'newField', 'newValue');

console.log(data);
```

Чтобы добавить к каждому объекту массива поле "disabled", зависящее от значения "device_type_id", можно пройтись по всем объектам массива с помощью рекурсии и добавить соответствующее значение поля "disabled". Ниже приведен пример кода на JavaScript:

```javascript
const array = [{
    id: 1,
    name: 'device 1',
    device_type_id: 1,
    children: [{
        id: 2,
        name: 'device 2',
        device_type_id: 2,
        children: [{
            id: 3,
            name: 'device 3',
            device_type_id: 1
        }]
    }]
}];

function addDisabledField(arr) {
    arr.forEach(obj => {
        obj.disabled = obj.device_type_id === 1; // пример условия, можно задать любую логику
        if (obj.children) {
            addDisabledField(obj.children);
        }
    });
}

addDisabledField(array);

console.log(array);
```

Этот код добавит к каждому объекту массива поле "disabled", которое будет зависеть от значения "device_type_id". Если "device_type_id" равен 1, то поле "disabled" будет равно true, в противном случае - false. Для другой логики условия нужно изменить выражение `obj.disabled = obj.device_type_id === 1;`.
В вашем методе disabledOs свойство children у элементов не меняется, т. к. метод map не мутирует переданный в него массив, а возвращает новый. 

disabledOs() {
    const modifyElement = (el, isDisabled) => {
        return {
            ...el,
            ...(el.children && {
                children: el.children.map(c => modifyElement(c, isDisabled)),
            }),
            disabled: isDisabled,
        };
    };

    return this.form.os.map(el => {
        const isDisabled = !this.form.device_types.includes(el.device_type_id);

        return modifyElement(el, isDisabled);
    });
};
Похожие вопросы