如何将嵌套的 javascript 对象转换为仅第一级属性对象?

2024-04-30

我有以下对象inputObj我想将其转换为一个简单的对象,例如outputObj.

var inputObj = {
    'a' : 1,
    'b' : true,
    'c' : 'string1',
    'd' : {
        'e' : 'string2',
        'f' : false,
        'g' : 5,
        'h' : {
            'i' : 7,
            'j' : 'string3',
            'k' : [
                {
                    'name' : 'l',
                    'value': 11
                },
                {
                    'name' : 'm',
                    'value': {
                        'n' : 13,
                        'o' : 'string4'
                    }
                }
            ]
        }
    },
    'p' : [
        {
            'name' : 'q',
            'value': 15
        },
        {
            'name' : 'r',
            'value': 'Awesome!'
        }
    ]
}

var outputObj = {
    'a' : 1,
    'b' : true,
    'c' : 'string1',
    'e' : 'string2',
    'f' : false,
    'g' : 5,
    'i' : 7,
    'j' : 'string3',
    'l' : 11,
    'n' : 13,
    'o' : 'string4',
    'q' : 15,
    'r' : 'Awesome!'
}

请注意,如果出现以下情况array最终的输出对象将由以下内容构建name and value属性如上例所示。

我尝试使用下面的代码来实现相同的功能。我知道当我调用嵌套函数时,最终对象正在重置,并且范围也不同。也许基本的闭包概念可以解决这个问题,但我对此感到困惑。如果您可以更正我的代码或全新的代码也可以。

function convertToFirstLevelObject( object ) {
	var returnObj = {};

	if( IsPrimaryDataType( object )) {
		return object;
	}
	else {
		if( object instanceof Array ) {
	        for ( var i = 0; i < object.length; i++ ) {
	        	if( typeof object[i] === 'object' && !(object[i] instanceof Array) ) {
	        		var key   = object[i]['name'],
	        			value = object[i]['value'];
	        		if( IsPrimaryDataType( value )) {
	        			returnObj[ key ] = value;
	        		}
	        		else {
	        			convertToFirstLevelObject( value );
	        		}
	        	}
	        	else{
	        		/* This condition is for Array of Array */
	        		if( object[i] instanceof Array ) {
	        			convertToFirstLevelObject( object[i] );
	        		} else {
	        			console.log('Wrong data passed, expected data id object or Array of objects');
	        			return;
	        		}
	        	}
	        }
		}
		else {
			for ( var attr in object ) {
	            if ( object.hasOwnProperty( attr ) ) {
	            	if( IsPrimaryDataType( object[ attr ] )) {
	            		returnObj[ attr ] = object[ attr ];
	            	}
	            	else {
	            		convertToFirstLevelObject( object[ attr ] )
	            	}
	            } 
	        }
		}
	}
	return returnObj;
}

function IsPrimaryDataType( input ) {
	var returnFlag = false;
	if( input === null || input === 'undefined' || typeof input !==  'object' ) {
		returnFlag = true;
	}
	return returnFlag;
}

Edit:这是另一个inputObj只是为了说明嵌套可以是任意级别的,这里我增加了数组嵌套的级别。在任何级别的数组嵌套中,它只会查找是否有任何对象具有name and value两者都是财产,那么它就会压平这一点。

 var inputObj = {
    'a' : 1,
    'b' : true,
    'c' : 'string1',
    'd' : {
        'e' : 'string2',
        'f' : false,
        'g' : 5,
        'h' : {
            'i' : 7,
            'j' : 'string3',
            'k' : [
                {
                    'name' : 'l',
                    'value': 11
                },
                {
                    'name' : 'm',
                    'value': [{'n' : 13},{'o' : 'string4'}]
                }
            ]
        }
    },
    'p' : [
        {
            'name' : 'q',
            'value': 15
        },
        {
            'name' : 'r',
            'value': 'Awesome!'
        }
    ],
    's' : [
        [{
            'name' : 't',
            'value': 17
        },
        {
            'name' : 'u',
            'value': 'string5'
        }],
        [ 1, 2, 3],
        [ "string6", "string7", "string8"],
        [
            [1,3,5],
            [{'name' : 'v', 'value' : 19, 'anyOtherProp' : false}],
            [2,4,6],
            [{'name' : 'w', 'otherProp' : 31}]
        ]
    ]
}

OutObj 应该如下所示

var outputObj = {
    'a' : 1,
    'b' : true,
    'c' : 'string1',
    'e' : 'string2',
    'f' : false,
    'g' : 5,
    'i' : 7,
    'j' : 'string3',
    'l' : 11,
    'n' : 13,
    'o' : 'string4',
    'q' : 15,
    'r' : 'Awesome!',
    't' : 17,
    'u' : 'string5',
    'v' : 19
}

您可以使用迭代和递归方法来循环对象。

function flatObject(source, target) {
    Object.keys(source).forEach(k => {
        if (Array.isArray(source[k])) {
            source[k].forEach(function iter(a) {
                if (Array.isArray(a)) {
                    a.forEach(iter);
                    return;
                }
                if (a !== null && typeof a === 'object') {
                    if ('name' in a || 'value' in a) {
                        'name' in a && 'value' in a && flatObject({ [a.name]: a.value }, target);
                        return;
                    }
                    flatObject(a, target);
                }
            });
            return;
        }
        if (source[k] !== null && typeof source[k] === 'object') {
            flatObject(source[k], target);
            return;
        }
        target[k] = source[k];
    });
}

var inputObj = { 'a': 1, 'b': true, 'c': 'string1', 'd': { 'e': 'string2', 'f': false, 'g': 5, 'h': { 'i': 7, 'j': 'string3', 'k': [{ 'name': 'l', 'value': 11 }, { 'name': 'm', 'value': [{ 'n': 13 }, { 'o': 'string4' }] }] } }, 'p': [{ 'name': 'q', 'value': 15 }, { 'name': 'r', 'value': 'Awesome!' }], 's': [[{ 'name': 't', 'value': 17 }, { 'name': 'u', 'value': 'string5' }], [1, 2, 3], ["string6", "string7", "string8"], [[1, 3, 5], [{ 'name': 'v', 'value': 19, 'anyOtherProp': false }], [2, 4, 6], [{ 'name': 'w', 'otherProp': 31 }]]] },
    target = {};

flatObject(inputObj, target);
console.log(target);
.as-console-wrapper { max-height: 100% !important; top: 0; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将嵌套的 javascript 对象转换为仅第一级属性对象? 的相关文章

随机推荐

  • 如何根据开始和结束条件过滤数据?

    我试图根据依赖于连续日期的两个条件来过滤数据 我在寻找对于 5 个以上的连续日期 值低于 2 with a 缓冲期 of 值 2 到 5 最多连续 3 天 它看起来像这样 很抱歉这里的 Excel 尝试很糟糕 第 1 天到第 10 天将包括
  • Java正则表达式以数字和固定长度开头的字符串

    我制作了一个正则表达式来检查 String 的长度 所有字符都是数字并以数字开头 例如 123 以下是我的表情 REGEX 123 d 9 但它无法检查字符串的长度 它仅验证那些长度为 9 并以 123 开头的字符串 但如果我传递字符串 1
  • 如何在WPF中使用Application.Exit事件?

    我需要删除一些特定文件 然后用户关闭 WPF 中的程序 所以我从这里尝试了 MDSN 代码http msdn microsoft com en us library system windows application exit aspx
  • csharp类可以像java类一样“继承”xml文档吗?

    我正在向一些csharp代码添加注释 并且我正在使用 net 或其他东西 提供的xml语言 我有一个接口和一些实现类 我在界面中有一个方法 它有一个注释 在实现类中没有对实现方法进行注释 当人们在java中这样做时 javadoc在生成文档
  • 如何将 Bootstrap 轮播指示器更改为点?

    我正在使用 Bootstrap 4 Beta 2 版本来做轮播 代码如下所示 ol class carousel indicators li class active li li li li li ol And the
  • pthread_join() 中的阻塞

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i
  • Android 中的离屏绘图

    android 中是否可以像 Objective C 中的 imageContext 那样进行离屏绘图 如果有的话 请告诉我链接或某种提示 多谢 我相信您正在寻找Canvas http developer android com refer
  • Mercurial revset 用于在提交后查找下一个标签

    我如何找到next tag在特定变更集修订之后 例如 如果变更集中引入了错误abcdef123456 如何找到包含此错误的第一个版本 标签 我想我可以使用HG 转速 https hg mozilla org mozilla central
  • 模拟网络断开连接以在本地测试分布式应用程序分区

    我有几个在本地主机上运行的分布式应用程序实例 每个实例都通过某些端口与其他实例通信 所有实例一起构成一个整体 我实际上是在谈论动物园管理员 http hadoop apache org zookeeper 在 Linux 上运行 现在我想编
  • iOS 应用程序的有效 UI 样式[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的问题很简单 在android中 我们可以将xml样式表与布局分离 以便它可以在任何地方重用 并且可
  • 在Android应用程序中导入Java项目?

    即使 Java 项目中的某些类在普通 Android 项目中无法识别 我是否可以在 Android 项目中使用 Java 项目 例如javax xml包 我认为有两种可能性 使用该 java 项目创建一个 jar 并将其导入到 androi
  • 使用 python 对 Robot Framework 中的测试套件中的每个测试用例进行测试设置和拆卸

    我是机器人框架的新手 有人可以帮我看看是否可以为包含大约 20 个测试用例的测试套件中的每个测试用例进行测试设置和拆卸 有人可以用例子解释一下吗 这是一个例子 包含拆解的测试套件 如果你想最后执行每个测试用例 你可以错过它的拆卸 请阅读相应
  • 如何将 C# 6 与网站项目类型一起使用?

    更新了现有的Web Site项目类型Visual Studio 2015 我将Framework更改为4 6 然后我希望在我的代码隐藏文件中可以使用所有这些新功能 不幸的是我收到如下错误 错误 CS8026 功能 表达式主体属性 在 C 5
  • 与 pandas 的时间序列相关性

    我有一些颗粒物传感器和 CSV 其时间序列如下 传感器A date value date 2017 11 30 00 00 00 30 11 17 0 00 49 2017 11 30 00 02 00 30 11 17 0 02 51 2
  • 多行 JTable 单元格在编辑期间不是多行的

    我正在开发一个应用程序 它有一个需要多行单元格的 JTable 因此 我扩展了 JTextArea 一切都显示出来了 但是当我尝试编辑单元格时 文本显示为单行 编辑后变为多行 我希望文本在编辑过程中保持多行 有没有办法做到这一点 创建您的表
  • Jquery 文件上传 - $_FILES 数组为空

    使用 Jquery 文件上传 它正在 工作 并上传图像并显示拇指 但是 当我在处理程序中提交表单时 如果我转储 FILES 则那里什么也没有 我基本上使用的是 Basic Plus 示例 并将 autoUpload 设置为 false 我希
  • 日期获取自定义周开始日的周数

    如果我有自定义周开始日而不是星期一 应该如何更改 Date 类的 getWeekNumber 原型 当前查找 ISO 周数的代码 Date prototype getWeekNumber function Create a copy of
  • Mono.Cecil 类似 Type.GetInterfaceMap 之类的东西吗?

    系统 反射 类型包含获取接口映射 http msdn microsoft com en us library system type getinterfacemap aspx这有助于确定哪些方法从接口实现某些方法 Does 莫诺 塞西尔包含
  • 检测空 UITextField 中的退格键

    Is there any way to detect when the Backspace Delete key is pressed in the iPhone keyboard on a UITextField that is empt
  • 如何将嵌套的 javascript 对象转换为仅第一级属性对象?

    我有以下对象inputObj我想将其转换为一个简单的对象 例如outputObj var inputObj a 1 b true c string1 d e string2 f false g 5 h i 7 j string3 k nam