这段代码是否将类属性添加到foo数组中?

时间:2013-10-03 02:52:56

标签: javascript jquery

下面是一段工作代码。 “= true”部分让我很困惑。这就是我认为正在发生的事情。

1-创建空数组 2-选择列表项(目标)并循环。
3-如果目标列表项的类属性不在数组中,则输入if block 4-添加目标列表项的类属性并添加它们 到阵列。

我的理解是javascript使用“push”而jqu​​ery使用“add” 将项插入数组。以下代码不使用推送或添加。

var foo = [];
$($targets).each(function(i) {
    if (!foo[$(this).attr('class')]) {
        foo[$(this).attr('class')] = true;
    }
});

2 个答案:

答案 0 :(得分:2)

代码存在缺陷,如果要将字符串用作键,则使用对象而不是数组:

var foo = {};

然后它检查对象中的密钥是否是假的,尽管您可能希望使用in运算符检查密钥是否存在:

$targets.each(function() {
  var klass = this.className; // cache, no need for jQuery
  // if `foo` doesn't have the key `klass` then add it
  if (! (klass in foo)) foo[klass] = true;
});

答案 1 :(得分:1)

除非班级名称是" 1"或" 2",您无法以这种方式访问​​阵列内的项目。也就是说,数组是从对象构建的。例如,您可以执行以下操作:

var foo = ['a', 'b', 'c'];
foo.bar = 'hello';

foo;
//=> ['a', 'b', 'c']

foo[0];
//=> 'a';

foo['bar'];
//=> 'hello';

所以发生的事情是你的脚本没有将这些项添加到实际的数组中。相反,它将它们分配给数组,就像它是一个常规的JavaScript对象一样。