我正在阅读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(这是做什么用的?)。
我理解其余部分,如果未定义,我们将结果推送到结果数组以返回它。
感谢您的帮助:)
答案 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
,这样类别名称也不会被推送到结果数组。