JSON 对象属性名转换 - CNode技术社区

JSON 对象属性名转换
发布于 12 年前 作者 sdfcbs91 18837 次浏览 最后一次编辑是 9 年前

工作中,写了个有意思的函数: self.upper.dataSourceTypes = JSON.parse(msg); //加载 库类型 //数据属性转换 var dataTypes = changeJsonName({changeName:{"TypeName":"name","TypeID":"id"},objs:self.upper.dataSourceTypes}); 把对象中的"TypeName","TypeID" 改成 name","id" //欢迎有兴趣的朋友指正优化!!! /* *JSON 属性名转换 *参数形式:{changeName:{a:A,b:B},objs:obj} => 例子: {changeName:{"id":"KEY"},objs:[{id:2},{id:4}]} id为2的JSON对象(数组)改变成[{KEY:2,KEY:4}] *changeName要修改的对象属性名=>{a:A,b:B},objs该对象/对象数组 */ function changeJsonName(o){ var newObj = []; if(o.hasOwnProperty("changeName")){ if(o.hasOwnProperty("objs")){ var cloneStr = JSON.stringify(o.objs); var cloneObj = JSON.parse(cloneStr); var doit = function(obj){

			if(obj.constructor == Array){
				for(var i=0;i<obj.length;i++){
					doit(obj[i]);
				}
			}else{
				//循环该对象的属性
				for(var i in obj){
					//循环要改变的属性名
					for(var x in o.changeName){
						//如果名称相同
						if(x == i){
							obj[o.changeName[x]] = obj[i];
							delete obj[i];
						}
					}
				}
			}
		}
		doit(cloneObj);
		return cloneObj;
	}
}
return false;

}

//欢迎有兴趣的朋友指正优化!!!

8 回复

代码高亮重新编辑一下吧...... 最好给个使用前、使用后的示例

var _ = require('lodash');
function changeKeyNames(obj, namesMap) {
 return _.transform(obj, function(result, value, key) {
 result[namesMap[key] || key] = value;
 });
}
changeKeyNames({'a': 1, 'b': 2, 'c': 3}, {'a': 'A', 'b': 'B'});
// → {'A': 1, 'B': 2, 'c': 3}

引用 ravenwang的数据 {‘a’: 1, ‘b’: 2, ‘c’: 3} 需要转换成 {‘A’: 1, ‘B’: 2, ‘c’: 3} 那么 就是 a=>A,b=>B,c不用变 changeJsonName({ changeName:{"a":"A","b":"B"}, objs:{‘a’: 1, ‘b’: 2, ‘c’: 3} });

写这么神奇的函数干啥:( 用来做数据重构么?

如果json结构很复杂,你的函数估计就没用鸟:)

在某些时候会用到,比如匹配在一个公用插件用的数据结构... 主要觉着有意思

我写的changeKeyNames是一个实现同样功能的函数...

const transformModel = (object = {}, keymap = {}) => {
 if (typeof object !== 'object' || object === null) return object
 if (Array.isArray(object)) {
 return object.map(value => transformModel(value, keymap))
 }
 return Object.keys(object).reduce((result, curkey) => {
 if (keymap[curkey]) {
 const { value, children } = keymap[curkey]
 result[value] = transformModel(object[curkey], children)
 } else {
 result[curkey] = object[curkey]
 }
 return result
 }, {})
}
const testKeyMap = {
 name: { value: 'title' },
 detail: {
 value: 'infos',
 children: {
 content: { value: 'body' },
 viewCount: { value: 'vc' }
 }
 },
 imgs: {
 value: 'images',
 children: {
 text: { value: 'name' }
 }
 }
}
const testOriginObj = {
 name: '名称',
 detail: {
 content: '内容',
 viewCount: '浏览量',
 other: '未定义项'
 },
 imgs: [
 { text: '图片1' },
 '图片2'
 ],
 other: '未定义项'
}
console.log(testOriginObj)
console.log(transformModel(testOriginObj, testKeyMap))
回到顶部

AltStyle によって変換されたページ (->オリジナル) /