阿里巴巴二面凉经 flatten扁平化对象与数组
在线笔试的时候写错了一点点 太可惜了哎 还是基础不够扎实。。。
const input = {
a: 1,
b: [ 1, 2, { c: true }, [ 3 ] ],
d: { e: 2, f: 3 },
g: null,
}
function flatten(input) {
// 需要实现的代码
}
flatten(input);
// 返回
{
"a": 1,
"b[0]": 1,
"b[1]": 2,
"b[2].c": true,
"b[3][0]": 3,
"d.e": 2,
"d.f": 3,
// "g": null, 值为null或者undefined,丢弃
};
function flatten(obj) {
let result = {};
if (Array.isArray(obj)) { // 初始的input是array 转为object
let tmp = {};
obj.forEach((item, index) => {
let attr = '[' + index + ']';
tmp[attr] = obj[index];
});
result = flatten(tmp);
} else {
Object.keys(obj).forEach(key => { // 通过key遍历对象
if (typeof obj[key] === 'object') {
// console.log(Object.prototype.toString.call(obj[key])) 也可以用这个判断准确的类型
// if (Array.isArray(obj[key])) {
if (Object.prototype.toString.call(obj[key]) === '[object Array]') { // 如果某项值为array
let tmp = {};
obj[key].forEach((item, index) => {
let attr = key + '[' + index + ']';
tmp[attr] = obj[key][index];
});
result = Object.assign({}, result, flatten(tmp)); // 转为对象后递归再与原来的result合并
}
else if (Object.prototype.toString.call(obj[key]) === '[object Object]') { // 如果是对象
let tmp = {};
Object.keys(obj[key]).forEach(k => {
let attr = key + '.' + k;
tmp[attr] = obj[key][k];
});
result = Object.assign({}, result, flatten(tmp)); // 递归后合并
}
} else {
if (obj[key]) { // 避免出现undefined
result[key] = obj[key];
}
}
});
}
return result;
}
思路2:记录前key递归
function flatten(input) {
let result = {}
function flat(prekey, ipt) {
if (ipt) {
let temp = {}
if (Object.prototype.toString.call(ipt) === '[object Object]') {
for (let key in ipt) {
temp = Object.assign(temp, flat(prekey + '.' + key, ipt[key]))
}
} else if (Array.isArray(ipt)) {
for (let key in ipt) {
temp = Object.assign(temp, flat(prekey + '[' + key + ']', ipt[key]))
}
} else {
temp[prekey] = ipt
}
return temp
}
}
for (let key in input) {
result = Object.assign(result, flat(key, input[key]))
}
return result
}
思路2: 贪心算法
-->
阿里巴巴二面凉经 flatten扁平化对象与数组的更多相关文章
- Numpy中扁平化函数ravel()和flatten()的区别
在Numpy中经常使用到的操作由扁平化操作,Numpy提供了两个函数进行此操作,他们的功能相同,但在内存上有很大的不同. 先来看这两个函数的使用: from numpy import * a = ar ...
- JS: 数组扁平化
数组扁平化 什么是数组扁平化? 数组扁平化就是将一个多层嵌套的数组 (Arrary) 转化为只有一层. // 多层嵌套 [1, 2, [3, 4]] // 一层 [1, 2, 3, 4] 递归实现 思 ...
- tensorflow tensor Flatten 张量扁平化,多通道转单通道数据
slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim) ...
- 使用 JavaScript 实现名为 flatten(input) 的函数,可以将传入的 input 对象(Object 或者 Array)进行扁平化处理并返回结果
请使用 JavaScript 实现名为 flatten(input) 的函数,可以将传入的 input 对象(Object 或者 Array)进行扁平化处理并返回结果.具体效果如下: const in ...
- 40套PSD欧美扁平化网页模板,可二次编辑开发,精品
40套PSD欧美扁平化网页模板,可二次编辑开发,绝对精品,下载地址:百度网盘, https://pan.baidu.com/s/1uMF4MM_3UC2Q6mbyNomLfQ 模板内容预览: 小
- slim.flatten——将输入扁平化但保留batch_size,假设第一维是batch
slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim) ...
- LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...
- js数组扁平化
看到一个有趣的题目: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 一个多维 ...
- JS数组专题1️⃣ ➖ 数组扁平化
一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...
随机推荐
- redis集群复制和故障转移
#### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...
- INNODB 数据页结构
InnoDB DataPage 16384B 16K 38B FILE HEADER 56B PAGE HEADER RECORD Infimum + supremum Records UserRec ...
- JavaScript数组常见用法
最近做一个项目中做一个竞猜游戏界面,游戏规则和彩票是一样的.在实现“机选一注”,“机选五注”的时候遇到数组的一些操作,例如产生['01', '02' ... '35']这样的数组,随机抽取不重复的元素 ...
- 一,View中引用自定义Dialog组件
需求: 在项目中,有时候可能在不同画面需要完成同一功能,比如示例文件列表查看功能,系统上传文件,需要查看文件列表,以及文件历史记录 话不多说,上图 这个查看文件的Dialog需要在系统中的很多地方调用 ...
- layui 数据表格最简单的点击事件
//定义点击事件 table.on('row(test)', function(obj){ console.log(obj.tr) //得到当前行元素对象 console.log(obj.data) ...
- [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)
[原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...
- [PHP插件教程]002.代码包PHP Beautifier的使用
This program reformat and beautify PHP source code files automatically. The program is Open Source a ...
- [JavaWeb基础] 003.JAVA访问Mysql数据库
上面两篇讲解了简单的JSP + Servlet的搭建和请求,那么后面我们肯定要用到数据交互,也就是操纵数据库的数据,包括对数字的增加,删除,修改,查询.我们就用简单的MySql来做例子 我们需要引入驱 ...
- 动态ip服务器 动态ip服务器的常用连接方式 收藏版
动态ip服务器目前比较常用的是VPS也叫作虚拟机.目前比较小型的vps服务器与普通电脑没什么区别,最大的区别就是用户连接zhidao服务器内的ip是固定不变的.而服务器运行的ip是可以动态的. 实现动 ...
- 最好用的FTP工具,最好用的FTP工具推荐!
IIS7服务器管理工具是一个良好的FTP的客户端,可以进行FTP的操作!同时,还可以作为VNC的客户端进行VNC的相关操作!它还能连接Windows和Linux的服务器和PC,并对他们的连接状态进行实 ...