Javascript 展平对象中的对象

Javascript 展平对象中的对象,javascript,object,flatten,Javascript,Object,Flatten,我试过这样做,它适用于具有一个属性的对象: 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(flattenO

我试过这样做,它适用于具有一个属性的对象:

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

假设您知道属性名称,则可以获取最后一次出现的事件,该事件不是函数:

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

只需执行一个简单的递归函数就可以完成这项工作:

测试:

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

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

我想分享一下我对这个问题的看法

递归,允许父键的前缀

var tst2={
答:1,,
b:2,
obj:{
a:3,
b:4,
obj:{
a:5,
b:6,
obj:function(){return x}
}
}
};
Object.prototype.flatte=函数(分隔符,前缀){
var-obj,前缀;
如果(此的类型!=“未定义”){
分隔符=分隔符| |'-';
前缀=参数。长度>1?(参数[1]。长度>0)?(参数[1]+分隔符):“”;
obj=arguments.length>2?参数[2]:{};
for(本文件中的var prop){
如果(这个hasOwnProperty(prop)){
变量路径=前缀+属性;
if(此[prop]=“object”的类型){
if(Object.prototype.toString.call(this[prop])=='[Object Object]'){
var flatten=此[prop].flatte(分隔符、路径、对象);
用于(变平变平){
if(展平。hasOwnProperty(展平)){
obj[扁平]=扁平[扁平];
}
}
}else if(此[prop]的类型!=“未定义”){
obj[path]=此[prop];
}
}else if(此[prop]的类型!=“未定义”){
obj[path]=此[prop];
}
}
}
}
返回obj |{};

};如果
{foo:{bar:'baz'}}
怎么办<代码>{bar:'baz'}
?只有一个对象是递归的,请检查我的编辑。谢谢你们的回答。我接受了一个。我必须添加
hasOwnProperty
check。
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;
}