Javascript 如何避免多重地图功能
我有两个目标。第一张有全校学生的详细记录。榜样Javascript 如何避免多重地图功能,javascript,jquery,object,Javascript,Jquery,Object,我有两个目标。第一张有全校学生的详细记录。榜样 var first = { students: [ { id:'1', name:"suresh", age:"20", degree:"BSc", status:"obsent"}, { id:'2', name:"ramesh", age:"21", degree:"BCom", status:"present"}, { id:'3', name:"rajesh", age:"19", degree:"
var first = {
students:
[
{ id:'1', name:"suresh", age:"20", degree:"BSc", status:"obsent"},
{ id:'2', name:"ramesh", age:"21", degree:"BCom", status:"present"},
{ id:'3', name:"rajesh", age:"19", degree:"BA", status:"leave"},
{ id:'4', name:"satish", age:"28", degree:"BL", status:"obsent"}
]
}
var second ={
students:
[
{ id:'1',status:"present"},
{ id:'12',status:"obsent"},
{ id:'3',status:"obsent"},
{ id:'14',status:"leave"}
]
}
第二个是关于当天学生状态的特定班级学生信息。榜样
var first = {
students:
[
{ id:'1', name:"suresh", age:"20", degree:"BSc", status:"obsent"},
{ id:'2', name:"ramesh", age:"21", degree:"BCom", status:"present"},
{ id:'3', name:"rajesh", age:"19", degree:"BA", status:"leave"},
{ id:'4', name:"satish", age:"28", degree:"BL", status:"obsent"}
]
}
var second ={
students:
[
{ id:'1',status:"present"},
{ id:'12',status:"obsent"},
{ id:'3',status:"obsent"},
{ id:'14',status:"leave"}
]
}
现在我需要比较学生id,并根据结果显示状态。我在以下方面取得了成就
items = first.students.map(function(item){
status =item.status;
second.students.map(function(key){
if(key.id == item.id) { status = key.status }
});
return "<tr><td>"+item.name+"</td><td>"+item.age+"</td><td>"+item.degree+"</td><td>"+status+"</td></tr>";
});
$('table#main tbody').html(items);
items=first.students.map(函数(项目){
状态=项目状态;
二.学生.地图(功能(键){
如果(key.id==item.id){status=key.status}
});
返回“+项目.名称+”“+项目.年龄+”“+项目.程度+”“+状态+”;
});
$('table#main tbody').html(项目);
上面的代码运行良好。但是如果你看一下我的代码,我已经多次使用了映射功能。我觉得我在表演方面做错了什么。这是否可能减少使用地图两次或任何其他更好的方式来实现相同的结果。请推荐我
代码片段
var first={
学生:
[
{id:'1',姓名:'suresh',年龄:'20',学位:'BSc',状态:'obsent'},
{id:'2',姓名:“ramesh”,年龄:“21”,学位:“BCom”,身份:“现在”},
{id:'3',姓名:“rajesh”,年龄:“19”,学位:“BA”,身份:“离开”},
{id:'4',姓名:“satish”,年龄:“28”,学位:“BL”,身份:“obsent”}
]
}
变量秒={
学生:
[
{id:'1',状态:“当前”},
{id:'12',状态:“obsent”},
{id:'3',状态:“obsent”},
{id:'14',状态:“离开”}
]
}
items=first.students.map(函数(项目){
状态=项目状态;
二.学生.地图(功能(键){
如果(key.id==item.id){status=key.status}
});
返回“+项目.名称+”“+项目.年龄+”“+项目.程度+”“+状态+”;
});
$('table#main tbody').html(项目)代码>
名称
年龄
度
支柱
由于对象的设置方式,看起来查找时间将是O(n)
了,因为您需要为每个学生id循环第一个学生数组
要解决此问题,您可以执行一个映射,将id指定为新中间对象的键,格式如下:
x={1:{…},2:{…}
从那里,您现在可以执行恒定时间O(1)
查找:
x[id]
唯一的额外工作是构建中间散列,但这将比上面的计算要少
请参见下面的示例。请注意,它确实使用了2个贴图,但与您的示例不同,因为它不是一个指数贴图中的贴图:
var students = [
{ id:'1', name:"suresh", age:"20", degree:"BSc", status:"obsent"},
{ id:'2', name:"ramesh", age:"21", degree:"BCom", status:"present"},
{ id:'3', name:"rajesh", age:"19", degree:"BA", status:"leave"},
{ id:'4', name:"satish", age:"28", degree:"BL", status:"obsent"}
];
var studentIds = {};
students.forEach(function(student) {
studentIds[student.id] = {name: student.name, age: student.age, degree: student.degree, status: student.status}
});
var second = [
{ id:'1',status:"present"},
{ id:'12',status:"obsent"},
{ id:'3',status:"obsent"},
{ id:'14',status:"leave"}
];
var studentStatuses = second.map(function(student) {
// do whatever you have to do here
return (studentIds[student.id] || {}).status;
});
如果您从秒开始构建一个键为id
且值为status
的对象,那么复杂性会更好。学生
然后您首先在中更新status
。学生
基于此对象:
var first={
学生:
[
{id:'1',姓名:'suresh',年龄:'20',学位:'BSc',状态:'obsent'},
{id:'2',姓名:“ramesh”,年龄:“21”,学位:“BCom”,身份:“现在”},
{id:'3',姓名:“rajesh”,年龄:“19”,学位:“BA”,身份:“离开”},
{id:'4',姓名:“satish”,年龄:“28”,学位:“BL”,身份:“obsent”}
]
}
变量秒={
学生:
[
{id:'1',状态:“当前”},
{id:'12',状态:“obsent”},
{id:'3',状态:“obsent”},
{id:'14',状态:“离开”}
]
}
var statusById=second.students.reduce(函数m,e){
m[e.id]=e.status;
返回m;
}, {});
items=first.students.map(函数(项目){
item.status=statusById[item.id]| | item.status;
返回“+项目.名称+”“+项目.年龄+”“+项目.程度+”“+项目.状态+”;
});
$('table#main tbody').html(项目)代码>
名称
年龄
度
支柱
谢谢你有用的答案。谢谢你有用的答案。