2013-12-17 4 views
0

Я попытался, как это, и это работает для объекта с одним свойством:Свести объект объектов

var foo = { foo: { foo: { foo: function(){ return x }}}}; 

function flattenObj(obj) { 
    var res; 
    for (var k in obj) { 
    res = obj[k]; 
    while (k in res) { 
     res = res[k]; 
    } 
    } 
    return res; 
} 

console.log(flattenObj(foo)); // function(){ return x } 

Как я могу заставить его работать с этим объектом?

{ baz: 'baz', foo: { baz: 'baz', foo: function(){ return x }}}; 

Так она возвращает:

{ baz: 'baz', foo: function(){ return x }} 

Edit:

var obj = { 
    a: 1, 
    b: 2, 
    obj: { 
     a: 1, 
     b: 2, 
     obj: { 
     a: 1, 
     b: 2, 
     obj: function(){ return x } 
     } 
    } 
    } 
+0

Что делать, если '{Foo: {бар: 'Баз'}}'? '{bar: 'baz'}'? – leaf

+0

Только один объект рекурсивный, проверьте мое редактирование. – lokhura

+1

Спасибо за ответы. Я принял его. – lokhura

ответ

0

The demo.

function flattenObj(obj) { 
    var tmp, k, res = {}; 
    for (k in obj) { 
    tmp = obj[k]; 
    while (typeof tmp == 'object' && k in tmp) { 
     tmp = tmp[k]; 
    } 
    res[k] = tmp; 
    } 
    return res; 
} 
+0

Спасибо, отлично! – lokhura

+0

Мне пришлось добавить проверку 'hasOwnProperty'. – lokhura

0

Предполагая, что вы знаете имя свойства, вы можете получить последнее вхождение который не является функцией:

while (typeof obj.obj !== 'function') { 
    obj = obj.obj; 
} 
0

Просто делать простую рекурсивную функцию, кажется, делает работу:

http://jsbin.com/AhAlEHOf/1/edit?js,console

function addOwnProperties (source, target) { 
    var properties = Object.keys(source); 
    for (var p in properties) { 
     var key = properties[p]; 
     var thisObject = source[key]; 
    if (typeof thisObject != 'object' || Object.keys(thisObject).length == 0) { 
     target[key] = thisObject;  
    } else { 
     addOwnProperties(thisObject, target) ; 
    } 
    } 
} 

тест:

var tst ={ baz: 'baz', foo: { baz: 'baz', foo: function(){ return x }}}; 

var res = {}; 

addOwnProperties(tst, res) ; 

console.log(res); 
// output : 
// [object Object] { 
// baz: "baz", 
// foo: function(){ return x } 
// } 

var tst2 = { 
    a: 1, 
    b: 2, 
    obj: { 
     a: 3, 
     b: 4, 
     obj: { 
     a: 5, 
     b: 6, 
     obj: function(){ return x } 
     } 
    } 
    } 

var res2 = {}; 

addOwnProperties(tst2, res2) ; 

console.log(res2); 
// output : 
// [object Object] { 
// a: 5, 
// b: 6, 
// obj: function(){ return x } 
//} 
0

Думал, что поделился бы этим вопросом.

Рекурсивный, допускает префикс родительских ключей.

var tst2 = { 
 
    a: 1, 
 
    b: 2, 
 
    obj: { 
 
     a: 3, 
 
     b: 4, 
 
     obj: { 
 
     a: 5, 
 
     b: 6, 
 
     obj: function(){ return x } 
 
     } 
 
    } 
 
    }; 
 

 
Object.prototype.flatten = function (separator, prefix) { 
 
    var obj, prefix; 
 
    if (typeof this != 'undefined') { 
 
     separator = separator || '-'; 
 
     prefix = arguments.length > 1 ? ((arguments[1].length > 0) ? (arguments[1] + separator) : '') : ''; 
 
     obj = arguments.length > 2 ? arguments[2] : {}; 
 
     for (var prop in this) { 
 
      if (this.hasOwnProperty(prop)) { 
 
       var path = prefix + prop; 
 
       if (typeof this[prop] == 'object') { 
 
        if (Object.prototype.toString.call(this[prop]) == '[object Object]') { 
 
         var flattened = this[prop].flatten(separator, path, obj); 
 
         for (var flat in flattened) { 
 
          if (flattened.hasOwnProperty(flat)) { 
 
           obj[flat] = flattened[flat]; 
 
          } 
 
         } 
 
        } else if (typeof this[prop] != 'undefined') { 
 
         obj[path] = this[prop]; 
 
        } 
 
       } else if (typeof this[prop] != 'undefined') { 
 
        obj[path] = this[prop]; 
 
       } 
 
      } 
 
     } 
 
    } 
 
    return obj || {}; 
 
};

Смежные вопросы