2016-07-27 20 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();