Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 展平对象的结构_Javascript_Function_Object - Fatal编程技术网

Javascript 展平对象的结构

Javascript 展平对象的结构,javascript,function,object,Javascript,Function,Object,社区!请给我一个提示。 我有以下任务: 首先,创建具有此结构的对象: obj = { x: 10, y: 20, inner: { x: 20, z: 30 }, foo2: { k: 23, p: 13 } } 编写函数convert obj,它获取参数obj。函数应返回一个新对象: newObj = {

社区!请给我一个提示。 我有以下任务:

首先,创建具有此结构的对象:

obj = {
       x: 10, 
       y: 20, 
       inner: {
          x: 20, 
          z: 30
            }, 
       foo2: {
          k: 23, 
          p: 13
       }
 } 
编写函数convert obj,它获取参数obj。函数应返回一个新对象:

 newObj = {
    x: 20,
    y: 20,
    z: 30,
    k: 23,
    p: 13
}
函数应包含用于。。。在里面而且只有一种

我正在尝试创建此函数,obj现在复制到newObj:

function convert(obj){
   newObj = {};
   for(key in obj){
      newObj[key] = obj[key];

   }
}

convert(obj);
但我不知道如何使用typeof从obj中删除内部和foo2子对象,并为newObj指定适当的x、z、k和p值


在课堂上,我们讨论的是基本的对象计算,所以不需要任何奇特的对象方法来解决这个问题。

在这种情况下,您需要递归

obj={ x:10, y:20, 内部:{ x:20, z:30 }, 食物2:{ k:23, p:13 } } 函数convertobj,newObj{ if!newObj{//在第一次迭代中创建结果对象 newObj={} } obj中的福基{ 如果obj的类型[键]=='编号'{//如果编号-添加,如果存在-更新 newObj[key]=obj[key]; }else{//if object-再次执行相同操作,但子对象和结果对象除外 convertobj[key],newObj } } 返回newObj }
console.logconvertobj 在这种情况下需要递归

obj={ x:10, y:20, 内部:{ x:20, z:30 }, 食物2:{ k:23, p:13 } } 函数convertobj,newObj{ if!newObj{//在第一次迭代中创建结果对象 newObj={} } obj中的福基{ 如果obj的类型[键]=='编号'{//如果编号-添加,如果存在-更新 newObj[key]=obj[key]; }else{//if object-再次执行相同操作,但子对象和结果对象除外 convertobj[key],newObj } } 返回newObj }
console.logconvertobj 你可以用一点递归非常简洁地完成这项工作

因为使用Object.fromEntries时,属性的最后一个条目将获胜,只要我们按文档顺序展平,最近的条目将获胜

const obj={x:10,y:20,内部:{x:20,z:30},foo2:{k:23,p:13} 函数*GetFlattedEntriesObj{ 让条目=Object.entriesobj; 对于条目的常量[k,v]{ //数组的typeof是对象,所以我们应该注意这一点 如果typeof v==object&&!Array.isArrayv{ 收益率*getsv; }否则{ 产量[k,v]; } } } const flatten=obj=>Object.fromEntriesGetFlattedEntriesAbj;
logflattenobj您可以使用一点递归非常简洁地完成这项工作

因为使用Object.fromEntries时,属性的最后一个条目将获胜,只要我们按文档顺序展平,最近的条目将获胜

const obj={x:10,y:20,内部:{x:20,z:30},foo2:{k:23,p:13} 函数*GetFlattedEntriesObj{ 让条目=Object.entriesobj; 对于条目的常量[k,v]{ //数组的typeof是对象,所以我们应该注意这一点 如果typeof v==object&&!Array.isArrayv{ 收益率*getsv; }否则{ 产量[k,v]; } } } const flatten=obj=>Object.fromEntriesGetFlattedEntriesAbj;
当您遍历obj的每个属性时,您需要根据属性是对象还是数字来执行不同的操作。这两种行为可以通过if/else和类型检查来实现。对于每个属性。。。如果属性是一个数字,请存储它!否则,如果属性是一个对象,则处理该对象中的所有属性。此外,您可能打算编写newObj[key]=obj[key]@byxor是的,谢谢,我刚刚纠正了这个问题。我冒昧地将您的问题的标题改为与您的问题实际相关的内容。@byxor感谢您在这个问题上花时间!当您遍历obj的每个属性时,您希望根据属性是对象还是数字来执行不同的操作。这两种行为可以通过if/else和类型检查来实现。对于每个属性。。。如果属性是一个数字,请存储它!否则,如果属性是一个对象,则处理该对象中的所有属性。此外,您可能打算编写newObj[key]=obj[key]@byxor是的,谢谢,我刚刚纠正了这个问题。我冒昧地将您的问题的标题改为与您的问题实际相关的内容。@byxor感谢您在这个问题上花时间!如果内部对象的深度从未超过1,则不需要递归。很难知道他们的教授是否希望他们使用递归。递归在这里绝对是合适的,而且是推荐的。@byxor是的,我同意,他们的导师通常不清楚他们希望怎么做task@qiAlex非常感谢。我不知道递归。你帮了我一个忙,如果内部对象的深度不超过1,那么就不需要递归了。很难知道他们的教授是否希望他们使用递归。递归
n在这里绝对是合适的,而且是推荐的。@byxor是的,我同意,他们的导师通常不清楚他们希望怎么做task@qiAlex非常感谢。我不知道递归。你帮了我很多。与提供的递归答案不同,这将只在固定深度下工作。与提供的递归答案不同,这将只在固定深度下工作。
function convert(obj){
   newObj = {};
   for(key in obj){
     if(typeof(obj[key])==='object')
      {
       for(k in obj[key])
       {
         newObj[k]=obj[key][k]
       }
      }else{
       newObj[key]=obj[key]
      }


   }
return newObj
}