2016-07-27 22 views
1

这里的数组是我的榜样阵列lodash代替angular.forEach的数组

var studentId= 2; 
var students = [ 
[{id:1,C:40,PHP:50},{id:2,C:60,PHP:70},{id:3,C:80,PHP:90}] 
[....] 
[...] 
] 

目前我对匹配学生studentId作为

_.forEach(students, function(student){ 
_.forEach(student, function(st){ 
if(st.id === studentId){ 
//do something 
} 
}); 

}) 

我如何可以用简单的lodash实现它命令。目标是避免两个forloop。

在此先感谢。

+0

你有对象的数组的数组。你不能跳过第二个循环。如果你只是需要找到一个具有特定身份证的用户,也许你必须重新映射所有学生的身份证号码作为密钥 – eltonkamami

+0

@eltonkamami你可以通过首先弄平它 – uzilan

+0

@uzilan你是对的。按照OP要求提供特定的代码。如果这样做太频繁,我认为表现会很糟糕 – eltonkamami

回答

0

,如果你只需要找到与特定ID的用户也许你不得不重新映射所有学生的哈希与他们的ID作为关键

这可以像这样

students = stundents.reduce(result, studentRow => { 
    studentRow.forEach(student => result[student.id] = student); 
    return result; 
}, {}); 

现在已经完成了学生是{“studentid”:“学生OBJ”}的对象
发现,如果学生用一个简单的检查

var studentId= 2; 
if(students[studentId]){ 
    //student exists 
} 

存在或者你可以扁平化深您的数组,然后对结果运行Array#filter

var students = _.flattenDeep(students); 
var studentFound = students.filter(student => student.id == studentID).length; 
if(studentFound){ 
    //student found, do something 
} 
+0

Thanks.I去与减少选项 –

0

试试这个

if (!_.isNil(_.find(students, { 'id': studentId }))) { 
    // do something 
} 
+0

为什么这个答案以“或”开头? –

0

而这里的另一种方式:

var s = _.chain(students) 
     .flatten() 
     .find({'id': studentId}) 
     .value();