Преобразуйте вложенный объект, используя lodash - PullRequest
1 голос
/ 23 марта 2019

Ввод:

const a =  {
            "8": [{
                "strategy": 123,
                "id": 1,
                "config": {
                    "global_dag_conf": {
                        "algo_v2_conf": {
                            "features_to_combine": [],
                            "segments": [],
                            "force_performance": false,
                            "min_bid": 0,
                            "max_bid": 13
                        }
                    }
                }
            }],
            "13": [{
                "strategy": 456,
                "id": 2,
                "config": {
                    "global_dag_conf": {
                        "algo_v2_conf": {
                            "ivr_measured": []
                        }
                    }
                }
            }]

        }

Выход:

{
   "8": [
      {
         "global_dag_conf": {
            "algo_v2_conf": {
               "features_to_combine": [],
               "segments": [],
               "force_performance": false,
               "min_bid": 0,
               "max_bid": 13
            }
         },
         "algo_id": 1
      }
   ],
   "13": [
      {
         "global_dag_conf": {
            "algo_v2_conf": {
               "ivr_measured": []
            }
         },
         "algo_id": 2
      }
   ]
}

Я попробовал приведенное ниже решение, которое отлично работает, но нужно знать, есть ли лучший способ сделать это, используя lodash и JS.

result = _.map(_.keys(addtionalAlgos), (algoType) => {
    addtionalAlgos[algoType] = _.map(addtionalAlgos[algoType], v => _.assign(v.config, { algo_id: v.id }));
    return addtionalAlgos;
  })[0]

Ответы [ 4 ]

1 голос
/ 23 марта 2019

Чистое решение Lodash с использованием mapValues ​​, map и назначить методы

let data = {"8":[{"strategy":123,"id":1,"config":{"global_dag_conf":{"algo_v2_conf":{"features_to_combine":[],"segments":[],"force_performance":false,"min_bid":0,"max_bid":13}}}}],"13":[{"strategy":456,"id":2,"config":{"global_dag_conf":{"algo_v2_conf":{"ivr_measured":[]}}}}]};

let res = _.mapValues(data, arr => _.map(arr, obj => _.assign({
  'algo_id': obj.id,
  'global_dag_conf': obj.config.global_dag_conf
})));

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 23 марта 2019

Вот решение без использования lodash:

  • Используйте Object.entries(), чтобы получить массив пар ключ-значение
  • Создать новый объект, используя reduce над массивом
  • Используйте map для создания нового массива объектов.
  • Уничтожьте каждый объект, чтобы получить id и config. Распространение переменная config для удаления одного уровня вложенности

const input = {"8":[{"strategy":123,"id":1,"config":{"global_dag_conf":{"algo_v2_conf":{"features_to_combine":[],"segments":[],"force_performance":false,"min_bid":0,"max_bid":13}}}}],"13":[{"strategy":456,"id":2,"config":{"global_dag_conf":{"algo_v2_conf":{"ivr_measured":[]}}}}]}

const output = 

Object.entries(input)
      .reduce((r, [key, value]) => {
          r[key] = value.map(({ id, config }) => ({ algo_id: id, ...config }));
          return r;
      }, {})
      
console.log(output)
1 голос
/ 23 марта 2019

Используйте _.mapValues() для итерации ключей и Array.map() с деструктуризацией объекта и синтаксис расширения для переформатирования объекта :

const data = {"8":[{"strategy":123,"id":1,"config":{"global_dag_conf":{"algo_v2_conf":{"features_to_combine":[],"segments":[],"force_performance":false,"min_bid":0,"max_bid":13}}}}],"13":[{"strategy":456,"id":2,"config":{"global_dag_conf":{"algo_v2_conf":{"ivr_measured":[]}}}}]}

const result = _.mapValues(data, 
  arr => arr.map(({ id: algo_id, config }) => 
    ({ algo_id, ...config })
))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 23 марта 2019

Альтернатива без лодаш.

Функция reduce позволяет генерировать объект, который будет заполнен, используя функцию map, которая преобразует исходные объекты в желаемую структуру.

const a =  {            "8": [{                "strategy": 123,                "id": 1,                "config": {                    "global_dag_conf": {                        "algo_v2_conf": {                            "features_to_combine": [],                            "segments": [],                            "force_performance": false,                            "min_bid": 0,                            "max_bid": 13                        }                    }                }            }],            "13": [{                "strategy": 456,                "id": 2,                "config": {                    "global_dag_conf": {                        "algo_v2_conf": {                            "ivr_measured": []                        }                    }                }            }]        };
        
let result = Object.entries(a).reduce((a, [key, arr]) => {
  return Object.assign(a, {[key]: arr.map(({id: algo_id, config}) => ({algo_id, ...config}))});
}, Object.create(null));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...