阿里巴巴二面凉经 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️⃣ ➖ 数组扁平化
一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...
随机推荐
- linux常用命令---域名服务
域名服务
- 第三篇:ASR(Automatic Speech Recognition)语音识别
ASR(Automatic Speech Recognition)语音识别: 百度语音--语音识别--python SDK文档: https://ai.baidu.com/docs#/ASR-Onli ...
- JUC整理笔记一之细说Unsafe
JUC(java.util.concurrent)的开始,可以说是从Unsafe类开始. Unsafe 简介 Unsafe在sun.misc 下,顾名思义,这是一个不安全的类,因为Unsafe类所操作 ...
- 1417. 重新格式化字符串--来源:力扣(LeetCode)
题目描述: 给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母. 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同.也就是说,字母后面应该跟着数字,而数字后面应该跟着字母. 请 ...
- 【python爬虫】解决歌荒,下歌利器
python下载图片,mp3,想必很多人都早已耳闻,今天给大家来点不一样的, 让你下载高逼格高品质,带进度条,实时显示下载速度 详见源码:https://www.kesci.com/home/proj ...
- queue.Queue()
一.构造方法 Queue是构造方法,函数签名是Queue(maxsize=0) ,其中maxsize设置队列的大小. 二.实例方法 Queue.qsize(): 返回queue的近似值.注意:qsiz ...
- 【持续更新】springboot相关配置
@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //注册了新的访问路径 @Override publi ...
- MRCTF 2020 WP
MRCTF 2020 WP 引言 周末趁上课之余,做了一下北邮的CTF,这里记录一下做出来的几题的WP ez_bypass 知识点:MD5强类型比较,is_numeric()函数绕过 题目源码: I ...
- PHP生成指定范围的日期
/** * 生成指定范围的日期 * * @param $string $startDate 开始日期 2020-01-01 * @param $string $endDate 结束日期 2020-01 ...
- Java实现 LeetCode 650 只有两个键的键盘(递归 || 数学)
650. 只有两个键的键盘 最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). ...