如何用大括号(包括子数组)包装json的值?

时间:2019-08-01 10:49:29

标签: javascript typescript lodash

基于此帖子How can I wrap the value of json with curly braces?

如何在嵌套结构中附加“值”?

  

{名称:“ Bill”,姓氏:“ Smith”,孩子:{           名称:“ Adam”,           选项:[{                      选项1”                    },                    {选项:“ 2”                    }]           }

结果应该是

{ name: { value:'Bill'}, lastname: { value:'Smith'},
  child: {
        name: { value:'Adam'},
        options: [{
                  option: { value:'1'}
                 },
                 { option: { value:'2'}
                 }]
        }
        ... 
}

3 个答案:

答案 0 :(得分:0)

递归运行它,并为数组和对象添加特殊处理。

const input = { name: 'Bill', lastname: 'Smith', child: { name: 'Adam', options: [{ option: "1" }, { option: "2" }] } };
const transform = (input) => Object.fromEntries(
  Object.entries(input).map(([key, value]) => {
    // If it is an array, transform each object in it
    if(Array.isArray(value)) {
      return ([key, value.map(el => transform(el))]); 
    } 
    // If it is an object, transform its value
    else if(typeof value === 'object' && value !== null)  {
      return [key, transform(value)]; 
    }
    // If it is a normal value, add the {value: } part
    else {
      return ([key, { value }]); 
    }
  })
);

console.log(transform(input));

答案 1 :(得分:0)

您需要为对象中的每个属性调用的递归函数。

var arr = { name: 'Bill', lastname: 'Smith', child: { name: 'Adam', options: [{ option: "1" }, { option: "2" }] } };

function translate(obj) {
  for (var property in obj){
    if (typeof obj[property] == "object") {
      obj[property] = translate(obj[property]);
    }
    else{
      obj[property] = {value: obj[property]}
    }
  }
  return obj;
}

console.log(translate(arr));

答案 2 :(得分:0)

您可以使用lodash的_.transform()创建一个递归函数,该函数迭代对象和数组,并使用value包装其他类型的属性:

const fn = obj => _.transform(obj, (acc, value, k) => {
  acc[k] = _.isObject(value) ? fn(value): { value }
})

const data = { name: 'Bill', lastname: 'Smith', child: { name: 'Adam', options: [{ option: "1" }, { option: "2" }] } }

const result = fn(data)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>