阿里巴巴二面凉经 flatten扁平化对象与数组
2024-10-09 05:12:13
2020-04-13
阿里巴巴二面凉经 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,丢弃
};
题解:
思路1:转为对象后递归
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: 贪心算法
创建两个数组分别存存在的可能和对应字符
从大往下算 每当Num>num[0] 那么result就+一次chars[0]
直到num < num[0] 那么把nums[0]和chars[0]删掉
循环上面的操作
-->
最新文章
- win7显示不是正版系统的解决方法
- MVC5 + EF6 简单示例
- python中的动态变量
- fastjson解析json,model字段有顺序要求吗
- linux显示-bash-4.2# 问题
- 加速传感器(CoreMotion) swift
- Poj 2081 Recaman&#39;s Sequence之解题报告
- C#socket通信1
- 关于JavaScript中的escape、encodeURI和encodeURIComponent
- Asp.net缓存技术(HttpRuntime.Cache)
- 修改DeDe标签Pagelist分页样式,自定义分页样式
- 第一册:lesson seventeen。
- jquery遇到的问题
- Django 学习第七天——Django模型基础第二节
- js实现星级评分效果(非常规5个li代码)
- GDI基础(1):绘制线条和图形
- 详解C#特性和反射(四)
- jquery1.9 下检测浏览器类型和版本的方法
- C结构体数组的应用
- 摄像头驱动OV7725学习笔记连载(一):OV7725 电器特性和时序图
热门文章
- Vue刷新页面的三种方式
- 系统对 Device Tree Overlays 的支持方式
- Spring Boot 教程(1) - HelloWorld
- jdk8 Collections#sort究竟做了什么
- IO流基础,创建File对象与方法是用
- python中几个双下划线用法的含义
- [Axure教程]0003.元件的触发事件
- SD.Team字符表情集大全(持续更新中..)
- Rocket - diplomacy - BaseNode
- 面试官问我会不会Elasticsearch,我语塞了...