2013-12-17 127 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 }} 

編輯:

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

如果什麼'{富:{吧: '巴茲'}}'? '{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 || {}; 
 
};