【问题标题】:using lodash instead of angular.forEach for array of arrays对数组数组使用 lodash 而不是 angular.forEach
【发布时间】:2016-07-27 06:41:55
【问题描述】:

这是我的示例数组

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。

提前致谢。

【问题讨论】:

  • 你有一个对象数组。你不能跳过第二个循环。如果您只需要查找具有特定 id 的用户,也许您必须将所有学生重新映射到以他们的 id 作为键的哈希
  • @eltonkamami 可以,首先将其展平
  • @uzilan 你是对的。 OP要求的lodash特定代码。我认为如果这样做太频繁,性能会很糟糕

标签: angularjs lodash


【解决方案1】:

如果您只需要查找具有特定 id 的用户,您可能需要将所有学生重新映射到以他们的 id 作为键的散列

这样就可以了

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

现在 students 是 { 'studentid': 'student 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
}

【讨论】:

  • 谢谢。我选择了减少选项
【解决方案2】:

试试这个

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

【讨论】:

  • 为什么这个答案以“或”开头?
【解决方案3】:

还有另一种方式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2015-07-10
    • 2017-01-22
    • 2017-02-22
    相关资源
    最近更新 更多