Обновить свойство объекта во вложенном массиве, используя Javascript или Lodash - PullRequest
0 голосов
/ 18 июня 2020

У меня есть вложенный массив, и каждый объект содержит уникальное свойство path. Поэтому я хочу обновить свойство value в зависимости от условия. Ниже приведена ссылка JSON объект

Таким образом, необходимо обновить объект ниже JSON, где path=httpgateway.concurrency.cacheConfig.localConcurrent.0.servers.1

Скажем, текущее значение localhost:9011, но я хочу его localhost:9012

[{
    "name": "httpgateway",
    "type": "Object",
    "value": [
        {
            "name": "concurrency",
            "type": "Object",
            "value": [
                {
                    "path": "httpgateway.concurrency",
                    "name": "stalePeriod",
                    "type": "PORT",
                    "value": "3000"
                },
                {
                    "name": "cacheConfig",
                    "type": "Object",
                    "value": [
                        {
                            "name": "localConcurrent",
                            "type": "Object",
                            "value": [
                                {
                                    "name": "",
                                    "type": "Array",
                                    "value": [
                                        {
                                            "path": "httpgateway.concurrency.cacheConfig.localConcurrent.0",
                                            "name": "service",
                                            "type": "TEXT",
                                            "value": "/mock/test"
                                        },
                                        {
                                            "name": "servers",
                                            "type": "Object",
                                            "value": [
                                                {
                                                    "name": "",
                                                    "type": "Array",
                                                    "value": [
                                                        {
                                                            "path": "httpgateway.concurrency.cacheConfig.localConcurrent.0.servers.0",
                                                            "name": "hostName",
                                                            "type": "URL",
                                                            "value": "localhost:9010"
                                                        },
                                                        {
                                                            "path": "httpgateway.cacheConfig.localConcurrent.0.servers.0",
                                                            "name": "concurrency",
                                                            "type": "NUMBER",
                                                            "value": "5"
                                                        }
                                                    ]
                                                },
                                                {
                                                    "name": "",
                                                    "type": "Array",
                                                    "value": [
                                                        {
                                                            "path": "httpgateway.concurrency.cacheConfig.localConcurrent.0.servers.1",
                                                            "name": "hostName",
                                                            "type": "URL",
                                                            "value": "localhost:9011"
                                                        },
                                                        {
                                                            "path": "httpgateway.cacheConfig.localConcurrent.0.servers.1",
                                                            "name": "concurrency",
                                                            "type": "NUMBER",
                                                            "value": "5"
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}]

1 Ответ

1 голос
/ 18 июня 2020

Вы можете сделать это в чистом виде JS вот так:

const updateKey = (obj, path, value) => {
    if (obj.path === path) {
        obj.value = value;

        return obj;
    }

    if (!Array.isArray(obj.value)) {
        return obj;
    }

    obj.value = obj.value.map(item => updateKey(item, path, value));

    return obj;
};

const updated = updateKey(data, 'httpgateway.concurrency.cacheConfig.localConcurrent.0.servers.1', 'localhost:9012');
...