我有一个我需要转换为不同格式的对象
原文:
{"module1":{"mod1":[{"hours":10},{"weeks":2},{"days":15}]},
"module2":{"mod2":[{"cars":1},{"cats":5},{"people":4}]},
}
期望的结果:
{"module1":"/mod1/10/2/15","module2":"/mod2/1/5/4" }
这是我的尝试(对不起,我还在学习这个)
function(newUrl){
var encodedUrl = {};
var tempString = "";
console.log(JSON.stringify(newUrl));
for (var p in newUrl) {
tempString = "/" + Object.keys(newUrl[p]);
for (var j in newUrl[p]){
_.each(newUrl[p][j], function(obj){
tempString += "/" + _.values(obj);
});
encodedUrl[p] = tempString;
console.log(encodedUrl);
}
}
}
所以,我认为我能够正确地制作字符串。不过它似乎只是第一次工作。它以奇怪的模式登录
Object {module1: "/mod1/10/2/15"}
Object {module1: "/mod1///"}
Object {module1: "/mod1///", module2: "/mod2/1/5/4"}
我认为我在解析这个问题时遇到了一些问题,但我无法确定它。会爱第二双眼睛来帮忙。谢谢!
答案 0 :(得分:2)
您必须依次遍历每个对象的属性,提取属性名称和值。还有一个数组,所以你也必须循环它。
4个嵌套循环。
function transformObj(obj) {
var tObj, tStr, tArr, aObj, result = {};
// For each own property in the object, e.g. 'module1'
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
// Transorm the value
tObj = obj[p];
tStr = '';
// For each property in that object, e.g. 'mod1'
for (var q in tObj) {
if (tObj.hasOwnProperty(q)) {
tStr = '/' + q;
tArr = tObj[q];
// for each member of the array
for (var i=0, iLen=tArr.length; i<iLen; i++) {
aObj = tArr[i]
// for each property of each member, e.g. hours, weeks days
for (var r in aObj) {
if (aObj.hasOwnProperty(r)) {
tStr += '/' + aObj[r];
}
}
}
}
}
// Assign transformed value to result object
result[p] = tStr;
}
}
return result;
}
var obj = {"module1":{"mod1":[{"hours":10},{"weeks":2},{"days":15}]},
"module2":{"mod2":[{"cars":1},{"cats":5},{"people":4}]},
};
console.log(JSON.stringify(transformObj(obj)));
// {"module1":"/mod1/10/2/15","module2":"/mod2/1/5/4"}
您可以使用Object.keys(...).forEach(...)
替换 for..in 和 hasOwnProperty 部分以减少代码,但可能会增加复杂性。
请注意, for..in 和 Object.keys 返回属性的顺序将相同,但可能不一定与您预期的一样,并且可能不同从浏览器到浏览器,因此当每个对象都有一个属性时,您只能期望一致的结果。
答案 1 :(得分:1)
可能有一种较短的方式,但似乎你的对象有点复杂。
Object.keys(obj).reduce(function(newObj, key, index) {
var module = obj[key];
var moduleKey = 'mod' + (index+1);
var arr = module[moduleKey].map(function(o){return o[Object.keys(o)[0]]}).join('/');
newObj[key] = "/" + moduleKey + "/" + arr
return newObj
}, {});