我正在读一本由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
,这样这个类别名称就不会被推送到结果数组中。