Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2014年12月29日 D5 #34

Open
nunnly opened this issue Dec 29, 2014 · 8 comments
Open

2014年12月29日 D5 #34

nunnly opened this issue Dec 29, 2014 · 8 comments
Labels

Comments

@nunnly
Copy link
Owner

nunnly commented Dec 29, 2014

写一个函数,可以把一个对象转换成一个扁平的对象
具体如下:

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]
}
*/
@witoad
Copy link

witoad commented Jan 23, 2015

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"}

@witoad
Copy link

witoad commented Jan 23, 2015

1 顺序不对 2 属性名不是单个字母的时候na.split("").join("/")有问题 。抛砖引玉啊

@srw4115
Copy link

srw4115 commented Feb 27, 2015

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;
}

@jsers
Copy link

jsers commented Feb 27, 2015

    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()
        }

    }

@VaJoy
Copy link

VaJoy commented Feb 27, 2015

还是@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;
}

@VaJoy
Copy link

VaJoy commented Feb 28, 2015

@XadillaX 大神能否来解下这道题呢?话说你好久没回everycode了

@lzzwoodtree
Copy link

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;
  }

@lzzwoodtree
Copy link

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]}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants