Pro AngularJS -你能帮我解释一下这部分代码吗?

Pro AngularJS - Could you help explain part of this code?

本文关键字:一下 这部分 代码 AngularJS 解释 Pro      更新时间:2023-09-26

我正在读一本由Apress出版的名为Pro AngularJS的书,我只是想确保我理解所有的代码,我对下面的代码有点困惑。

下面是书中的一个自定义过滤器,它接受2个参数,数据数组和属性名。在本书中,属性名是数据中的类别键,设置它是为了删除重复的类别,以便显示指向每个类别的导航链接列表,而不存在重复。

angular.module("customFilters", [])
    .filter("unique", function () {
        return function (data, propertyName) {
            if (angular.isArray(data) && angular.isString(propertyName)) {
                var results = [];
                var keys = {};
                for (var i = 0; i < data.length; i++) {
                    var val = data[i][propertyName];
                    if (angular.isUndefined(keys[val])) {
                        keys[val] = true;
                        results.push(val);
                    }
                }
                return results;
            } else {
                return data;
            }
} });

我不明白的是for循环中的键部分。键被定义为对象字面量?然后,在for循环中,对于我们循环过的数据中的每个项,如果键[val]是未定义的(这意味着什么)?然后将keys[val]设置为true(这是做什么的?)。

我有点理解剩下的,如果它是undefined,我们将结果推入results数组返回它

谢谢你的帮助

简单地说,这只是为了记住我们已经处理了值val,并且如果它再次出现在循环中,则不返回重复项。

您必须在keys对象中放入一些东西,例如keys[val] = true;,以便在下一次循环迭代中定义keys[val]

如果你没有在keys[val]中放入任何东西,angular.isUndefined(keys[val])在下一次循环中具有相同的值val将计算为true,然后你的结果将被复制(这不是唯一的)

解释和回答你的问题

如果键[val]是未定义的(这是什么意思)?

基本上意味着键val不存在于对象keys中,例如,对象{'age': 45}包含键age,但不包含键weight

然后keys[val]被设置为true(这是做什么的?)

这将对象keys的关键字val设置为true,因此keys对象的某个地方看起来像这样{<val>: true, <other key>: ...,}

在这一步之后,为对象keys定义了键val,因此angular.isUndefined(keys[val])条件为假

键[val]的首要目的是什么?对不起,我只是不清楚它在做什么。

代码使用对象keys = {},其行为类似于键/值数据结构(在其他语言中是字典或映射),目的是记住我们已经处理了val

如果您不记得您已经处理(返回)的值,那么您将返回重复的值,因此您的unique过滤器将不再返回唯一值,这就是这里的代码

的目的。

让我们看看第一行return function(data, propertyName)这里的data是要根据propertyName(category in this case)进行筛选的对象数组。

然后定义var keys = {},即一个空对象。

现在通过for循环,我们将propertyName(category in this case)的值放入变量val中。

例如data数组的第一个对象是这样的[{ product: "product 1", category: 'Category 3'}, ....]

因此,val = data[i][propertyName]的值转换为data[0][category],其计算结果为第3类

现在angular.isUndefined(keys['Category 3'])行对于if条件将求值为true(这里我们询问给定条件是否未定义,其求值为true,因此如果条件通过)。

在if循环中,我们设置了keys[val] = true,这样这个类别名称就不会被推送到结果数组中。