-
Notifications
You must be signed in to change notification settings - Fork 139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JS面试题求解 #21
Comments
第一题做了一下,时间复杂度o3
在Chrome 控制台测试可行 |
代码外面加上三个 ` 可以变好看 @zhangolve @willes |
简单实现,先做第一道题目,下面是我的解法:
|
第一题: `
` |
@fonglezen @RookieDay 请问第三题怎么弄呢 |
话说第二题,我愣是看不懂。。 你2016年9月1号,在8月份的日历里面也是算第五周啊??那为什么2月1号算2月的第一周,9月1号算8月的第五周? 这个逻辑判断是啥?? |
@willes ,简单的 遍历b数组,拿它单个对象里面的id去找a里面的对象,然后for in添加,相同的属性continue |
@henryzp 第二题要是能够用库的话,只是获取当年的第几周其实就简单了。然而并不是,总觉得第二题真要是面试出的话很坑,并不像是考js,而是考算法,当然算法是基础。
|
第三题 @willes , 复杂度应该O(N)吧 const map = a.reduce((acc, curr, index) => {
acc[curr.id] = index;
return acc;
}, {});
b.forEach(o => {
const index = map[o.id];
if (index !== undefined) {
a[index] = Object.assign(a[index], o);
}
else {
a.push(o);
}
}); |
这里是什么意思?干嘛要这样做呢? |
@fonglezen 建一个反向查找的表 id -> index,不然对于b数组里面每个id都需要遍历一遍a数组,最后复杂度就变成O(n^2)了。 |
第一题
|
第一题
|
//NO.1
//函数式
function convert(data){
var metas = data.metaData.map(ele=>ele.name);
return data.rows.map(ele=>{
var obj = {};
metas.forEach((meta,index)=>{
obj[meta] = ele[index];
});
return obj;
});
}
//NO.3
//函数式
function merge(a,b){
var logs = {};
var array = [];
//copy a;
a.forEach(ele=>{
var obj = {};
Object.keys(ele).forEach(key=>obj[key]=ele[key]);
logs[ele.id] = array.length;
array.push(obj);
});
//merge b;
b.forEach(ele=>{
var obj = {};
var index = logs[ele.id];
if (index !== undefined){
obj = array[index];
}
Object.keys(ele).forEach(key=>obj[key]=ele[key]);
if (index == undefined){
array.push(obj);
}
});
return array;
} |
NO.01
|
第一小题,写的不完美,但是勉强能运行。 var data={
rows: [
["Lisa", 16, "Female", "2000-12-01"],
["Bob", 22, "Male", "1996-01-21"]
],
metaData: [
{name: "name", note: ''},
{name: "age", note: ''},
{name: "gender", note: ''},
{name: "birthday", note: ''}
]
};
//函数主体部分
function change(rows,meta){
var my=[];
rows.map(function(ele){
var temp={};
ele.map(function(e,i){
temp[meta[i].name]=e;
});
my.push(temp);
});
console.log(my);
};
change(data.rows,data.metaData); |
第一题:
第二题不会...
感觉自己写的好蠢 |
第一题:
应该没有错吧。。。不知道写的规范不规范。。 |
@ningt 这种问题一般是不是不会去考虑兼容性,如果考虑兼容性,设计时间复杂度是不是就上去了? |
@tangxiaolang101 个人感觉这种题应该跟兼容性没太大关系,假如面试官说你不可以用 |
@ningt 哦哦,也对。那对象拷贝这个问题,如果是兼容性的化,时间复杂度是不是就只能是O(n^2)了 |
@tangxiaolang101 不知道你具体指的哪儿的对象拷贝,但有的api是是有额外的O(N),所以也需要注意 |
@ningt 就是Object.assign() |
@tangxiaolang101 第三题里面N -> 数组长度,数组里面每个object的key的长度都是常数,所以Object.assign的时间复杂度应该是常数 |
@ningt 哦哦,对的。我刚才的意思是想表达,如果这里对象合并不能使用Object.assign,是不是只能用for去处理,然后整个的时间复杂度就提升了 |
@tangxiaolang101 在这道题用for跟用Object.assign其实没有区别,因为Object.assign的本质就是遍历object的key然后更新它的值。这道题里面每个object的key的数量都是常数,所以不会影响最后的Big O |
第一题我直接两个forEach不到10行的代码解决了
第三题暂时没有想到更好的办法
|
第一题: function transData ({rows, metaData}) {
return rows.map(item => {
let result = {}
for (let i = 0, k = item.length; i < k; i++) {
result[metaData[i].name] = item[i]
}
return result
})
} |
第一个我的解法,仅供参考: data.rows.map((row) => row.reduce((rowData, value, i) => {
rowData[data.metaData[i].name] = value
return rowData
}, {})) PS:第一题已经收录到:https://scriptoj.com/problems/32 大家可以检测一下自己做得对不对。 |
|
第二题:
|
第一题:
第三题:
|
|
第二题
|
第一题 const data = {
rows: [
[ 'Lisa', 16, 'Female', '2000-12-01' ],
[ 'Bob', 22, 'Male', '1996-01-21' ],
],
metaData: [
{ name: 'name', note: '' },
{ name: 'age', note: '' },
{ name: 'gender', note: '' },
{ name: 'birthday', note: '' },
],
}
const keyNames = data.metaData.map(item => item.name)
const newData = data.rows.map(row => {
const rowObj = {}
row.forEach((rowValue, index) => { rowObj[keyNames[index]] = rowValue })
return rowObj
})
console.log(newData) |
第一题:刚入手 const data = {
rows: [
["Lisa", 16, "Female", "2000-12-01"],
["Bob", 22, "Male", "1996-01-21"]
],
metaData: [
{name: "name", note: ''},
{name: "age", note: ''},
{name: "gender", note: ''},
{name: "birthday", note: ''}
]
}
const keys = [];
data.metaData.forEach(item=>{
keys.push(item.name)
})
const res = data.rows.map(item=>{
const tmp = {};
for(let i = 0; i < item.length; i++) {
tmp[keys[i]] = item[i]
}
return tmp
})
console.log(res) 获取 key 的操作不需要了 const res = data.rows.map(item=>{
const tmp = {}
for(let i = 0; i < item.length; i++) {
tmp[data.metaData[i].name] = item[i]
}
return tmp
}) 再改,参考了 胡子大哈 的解法,去仔细看了看 const res = data.rows.map(item => {
item.reduce((rowData, value,i) => {
rowData[data.metaData[i].name] = value
return rowData
}, {})
})
console.log(res) |
第一题:
第三题:
|
function toChange(rows, metaData) {
return rows.map(arry => {
const obj = {};
arry.forEach( (value,index) => {
obj[metaData[index].name] = value;
})
return obj;
})
} |
第一题function fn1(obj) {
return obj.rows.map(row => {
const item = {};
row.forEach((rowItem, index) => {
item[obj.metaData[index].name] = rowItem;
})
return item;
});
} 第三题function fn3(a, b) {
const ab = a.map(itemA => {
const otherObj = b.find(itemB => itemB.id === itemA.id);
return Object.assign(itemA, otherObj);
})
const newAdds = b.filter(({ id }) => !ab.find(item => item.id === id));
return ab.concat(newAdds);
} |
一、从某数据库接口得到如下值:
rows是数据,metaData是对数据的说明。现写一个函数,将上面的Object转化为期望的数组:
二、写一个函数,判断给定的日期是几月的第几周,当月1日属于上一月的,该周计入上一月。例如:
1)输入日期2016-02-01,返回结果为2-1,表示2016年2月1日属于2月的第一周;
2)输入日期2016-09-01,返回结果为8-5,表示2016年9月1日属于8月的第五周。
三、数组
数组
写一个函数按id用b更新a,期望得到的结果为:
The text was updated successfully, but these errors were encountered: