javascript - 如何将 JavaScript 嵌套 For 循环替换为更清晰、简洁的内容?

标签 javascript for-loop functional-programming

我是 JavaScript 新手,发现以下嵌套 for 循环 很糟糕:

    $scope.parents = []; 
      for (var k = 0; k < $scope.children.length; k++) {
         for (var i = 0; i < $scope.todos.length; i++) {
           if($scope.todos[i].todosern == $scope.children[k].todosernm){
              $scope.parents.push($scope.todos[i]);
            }
         }
      }

任何人都可以告诉我如何利用 JavaScript 的函数功能,并以清晰、简洁的方式重写它,如果可能的话,不要使用 for 循环

虽然我的问题类似于 this question ,我相信它们的不同足以让我提出这个问题。

请仅包含所有现代浏览器都支持的结构,排除例如 includes 因为它是 not supported by IE or Android

编辑:

根据 Nina 的合理要求,这是我的数据模型:

var mongoose = require('mongoose');

var TodoSchema = new mongoose.Schema({
todosern: String,
todotype: String,
todosernm: String,
salmserna: String,
salmsernb: String,
todotask: String,
todostart: String,
todostartt: String,
todoend: String,
todoendt: String
});

module.exports = mongoose.model('Todo', TodoSchema);`

最佳答案

您可以使用一个对象作为哈希表,首先收集具有给定属性 todosernm 的所有子项,然后仅过滤哈希表中的子项。

var hash = Object.create(null);

$scope.children.forEach(function (a) {
    hash[a.todosernm] = true;
});

$scope.parents = $scope.todos.filter(function (a) {
    return hash[a.todosern];
});

对于更多函数式编程,您可以替换第一个 Array#forEachArray#reduce .

var hash = $scope.children.reduce(function (r, a) {
    r[a.todosernm] = true;
    return r;
}, Object.create(null));

$scope.parents = $scope.todos.filter(function (a) {
    return hash[a.todosern];
});

关于javascript - 如何将 JavaScript 嵌套 For 循环替换为更清晰、简洁的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43737914/

相关文章:

haskell - 如何推断 Scott 编码的 List 构造函数的类型?

javascript - 使用 span 标签将数字包装在 javascript 字符串中

javascript - 复选框未显示在 md-select multiple 中

java - 是否有用于函数编程的 java 库?

R 多元回归循环和提取系数

javascript - 如何在javascript中将一个数组拆分为两个数组?

scala - 如何将 ADT 列表分成其变体?

javascript - AngularJS:在使用 ng-src 指令时使用 $http 拦截器和 OAuth token

javascript - extjs 网格适用于 Firefox,不适用于 IE

sql-server - SSIS Foreach 循环 - Excel 工作表 - 'xlnm#_FilterDatabase'(幻影/幽灵工作表)