everycode icon indicating copy to clipboard operation
everycode copied to clipboard

2014年12月29日 D5

Open nunnly opened this issue 11 years ago • 8 comments

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

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

nunnly avatar Dec 29 '14 08:12 nunnly

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 avatar Jan 23 '15 09:01 witoad

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

witoad avatar Jan 23 '15 09:01 witoad

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

srw4115 avatar Feb 27 '15 08:02 srw4115

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

    }

jsers avatar Feb 27 '15 09:02 jsers

还是@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 avatar Feb 27 '15 09:02 VaJoy

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

VaJoy avatar Feb 28 '15 09:02 VaJoy

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 avatar Feb 28 '15 09:02 lzzwoodtree

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

lzzwoodtree avatar Feb 28 '15 10:02 lzzwoodtree