упростить преобразование объекта с помощью функций JavaScript более высокого порядка - PullRequest
0 голосов
/ 18 мая 2018

Цель: я пытаюсь уменьшить сложность преобразования моего объекта.Мне сказали использовать функции более высокого порядка, чтобы уменьшить сложность.Я в основном смотрю на блок кода для упрощения, но любые другие указатели или помощь будут приветствоваться.

Проблема: я не вижу четкого способа упростить это даже с функциями более высокого порядка.

Примечание: я не гарантирую наличие всех полей, поэтому мне нужно защититься от ключа неопределенного.Вот почему я делаю (model) => model.key только для чтения свойства, если я проверяю, есть ли ключ.

model:

{ 
  "origName1": "val1",
  "origName2": "val2",
  "origName3": "val3",<-- this key value is not always present
  "origName4": "val4"  
}

мой объект преобразования:

let transFormObj = {};
transFormObj.origName1= {'newKey': 'newName1', 'value': (model) => model.origName1};
transFormObj.origName2= {'newKey': 'newName2', 'value': (model) => model.origName2};
transFormObj.origName3= {'newKey': 'newName3', 'value': (model) => model.origName3};
transFormObj.origName4= {'newKey': {parentKey: 'newObj', childKey: 'newName4'}, 'value': (model) => model.origName4};

Блок for, на котором я фокусируюсь:

 let returnObj = {}
        for(let key in model) {
            if(key in transFormObj) {
                // is nested object?
                if(typeof(transFormObj[key].newKey) === 'object') {
                    // if parent key doesn't exist create else keep it the same
                    returnObj[transFormObj[key].newKey.parentKey] = returnObj[transFormObj[key].newKey.parentKey] || {};
                    returnObj[transFormObj[key].newKey.parentKey][transFormObj[key].newKey.childKey] = transFormObj[key].value(model);
                } else {
                returnObj[transFormObj[key].newKey] = transFormObj[key].value(model);}
            }
        }

ожидаемый объект вывода:

{ 
      "newName1": "val1",
      "newName2": "val2",
      "newName3": "val3",
      "newObj": {"newName4" :"val4"}  
    }

1 Ответ

0 голосов
/ 18 мая 2018

Это самое дальнее, что я мог упростить. фильтр избавился от if. Reduce избавился от переменных for и returnObj;

return Object.keys(model)
        .filter(key => key in transFormObj)
        .reduce((rObj, key) =>
        {
            let newKey = transFormObj[key].newKey;
            if(isObject(newKey)) {
                let parentKey =  newKey.parentKey;
                let childKey = newKey.childKey;
                rObj[parentKey] = rObj[parentKey] || {};
                rObj[parentKey][childKey] = transFormObj[key].value(model);
            } else {
                rObj[newKey] = transFormObj[key].value(model);
            }
            return rObj;
        }, {}
        );
...