2014年12月29日 D5
写一个函数,可以把一个对象转换成一个扁平的对象 具体如下:
function flattenMap(map) {
// Add your code here
}
var a = {
'a': {
'b': {
'c': 12,
'd': 'Hello World'
},
'e': [1,2,3]
}
}
flattenMap(a);
/*
return
{
'a/b/c': 12,
'a/b/d': 'Hello World',
'a/e': [1,2,3]
}
*/
var flattenMap=function(){ var result={}; var na="" return function (a){ for(var key in a){ if (Object.prototype.toString.call(a[key])!=="[object Object]"){ na=na+key;
result[na.split("").join("/")]=a[key];
na=na.substring(0,na.length-key.length)
}
}
for(var key in a){ if (Object.prototype.toString.call(a[key])=="[object Object]"){ na=na+key; flattenMap(a[key]); } }
return result; } }() flattenMap(a) Object {a/e: Array[3], a/b/c: 12, a/b/d: "Hello World"}
1 顺序不对 2 属性名不是单个字母的时候na.split("").join("/")有问题 。抛砖引玉啊
function test(a){ var c = {} function loop(obj,path){ var names = Object.getOwnPropertyNames(obj); names.forEach(function(name){ var p = path + name; if(Array.isArray(obj[name]) || typeof obj[name] !== "object"){ c[p] = obj[name]; } else{ p += '/'; loop(obj[name],p); } }) } loop(a,''); return c; }
function flattenMap(map,cache) {
var a = cache || [];
for(key in map){
a.push(key);
if(map[key].constructor === Object){
flattenMap(map[key],a)
}else{
console.log(a.join("/")+": "+map[key])
}
a.pop()
}
}
还是@srw4115 写的好,小改下:
function flattenMap(a){
var result = {},
loop = function(obj,path){
var names = Object.keys(obj);
names.forEach(function(name){
var p = path + name;
if(Object.prototype.toString.call(obj[name]) === "[object Object]"){
loop(obj[name],p+"/")
}else{
result[p] = obj[name]
}
})
}
loop(a,'');
return result;
}
@XadillaX 大神能否来解下这道题呢?话说你好久没回everycode了
function flattenMap(map){
var result = null;
var route = null;
if (arguments && arguments[1] && Object.prototype.toString.call(arguments[1]) === "[object Object]") {
result = arguments[1];
}else {
result = {};
}
if (arguments && arguments[2] && Object.prototype.toString.call(arguments[2]) === "[object String]") {
route = arguments[2];
}
for (var p in map) {
if (route) {
route = route + '/' + p;
}else {
route = p;
}
if (Object.prototype.toString.call(map[p]) !== "[object Object]"){
result[route] = map[p];
} else {
flattenMap(map[p], result, route);
}
var routeArray = route.split('/');
routeArray.pop();
route = routeArray.join('/');
}
return result;
}
var a = { 'a': { 'b': { 'c': 12, 'd': 'Hello World', 'g':{ 'h':89 }, 'i':'fc' }, 'e': [1,2,3] } } console.log(flattenMap(a)); {a/b/c: 12, a/b/d: "Hello World", a/b/g/h: 89, a/b/i: "fc", a/e: Array[3]}