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

时间:2015-09-17 07:32:19

标签: javascript angularjs

我正在阅读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(这是做什么用的?)。

我理解其余部分,如果未定义,我们将结果推送到结果数组以返回它。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

简单地说,这只是一种记住我们已经处理了值val的方法,如果它在循环中再次出现,则不会返回重复项。 < / p>

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

如果您未在keys[val]中添加任何内容,angular.isUndefined(keys[val])在具有相同值val的下一个循环中将评估为true,那么您的结果将会重复(这不是唯一的)

解释和回答您的问题

  

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

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

  

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

这会将对象val的键keys设置为true,因此某处keys对象看起来像{<val>: true, <other key>: ...,}

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

  

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

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

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

答案 1 :(得分:0)

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

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

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

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

因此,val = data[i][propertyName]的值会转换为data[0][category],其评估为类别3

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

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