阿里巴巴二面凉经 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️⃣ ➖ 数组扁平化
一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...
随机推荐
- 六、表达式:前缀&&后缀
count为运算后的值.
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
- PHP链式操作原理
1)第一种方法 <?php /* *类功能:实现数据库的连贯查询操作 */ class mysql_query{ var $tbl=’user’;//要操作的表名 var $limit=”;// ...
- python的性能测试(timeit)
import timeit def test(): lista = [] listb = [] for i in range(100): lista.append(i) for i in range( ...
- 【Mac+Wind7】pytest + allure生成定制报告
一.升级Powershell(windows7及以上版本默认自带.其实普通的CMD命令行工具够用了) 我是Win7默认带的pw1.0,太古老了升级一下,地址如下,选择与自己windows版本匹配的连接 ...
- JavaSE案例-Bank
项目介绍 完成基本的银行业务功能 存款 取款 转账 查询余额 修改密码 修改预留手机号 注销账号 退出 任务分解: 定义三个基本类: BankTest():银行业务主程序 Bank(): 银行类,包含 ...
- MySQL死锁系列-常见加锁场景分析
在上一篇文章<锁的类型以及加锁原理>主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能 ...
- Eclipse中java文件选中变量名,相同变量都变色显示 .
第一步设置高亮显示的颜色: Window-->preferences-->General-->Editors-->Text Editors-->Annotations-- ...
- [SD心灵鸡汤]000.每月一则 - 索引
[SD心灵鸡汤]001.每月一则 - 2015.05 [SD心灵鸡汤]002.每月一则 - 2015.06 [SD心灵鸡汤]003.每月一则 - 2015.07 [SD心灵鸡汤]004.每月一则 - ...
- Java IO(十三)PipedReader 和 PipedWriter
Java IO(十三)PipedReader 和 PipedWriter 一.介绍 PipedReader 和 PipedWriter 分别是管道字符输入流和管道字符输出流,它们同 PipedInpu ...