【问题标题】:JavaScript forEach Syntax and lengthJavaScript forEach 语法和长度
【发布时间】:2018-10-04 23:42:43
【问题描述】:

我正在遍历整个汽车数组,并查看没有“过滤掉”类的对象的计数。是否可以简化此语法?我知道在 jQuery 中你可以用元素做这样的事情:

        $("element").hasClass("filtered-out").length;

我的代码:

        var available_cars = 0;
        cars.forEach(function(element) {
            if (!element.hasClass("filtered-out"))
                available_cars++;
        });

【问题讨论】:

标签: javascript jquery arrays foreach refactoring


【解决方案1】:

你可以使用filter:

var available_cars = cars.filter(function(car) { return !car.hasClass("filtered-out"); }).length;

使用 ES2015+ 箭头函数更简洁:

var available_cars = cars.filter(car => !car.hasClass("filtered-out")).length;

如果您可以将 cars 设为 jQuery 对象而不是数组(您似乎在问题中将其用作数组),则为:

var available_cars = cars.filter(":not(.filtered-out)").length;

问题将cars 视为一个数组(cars.forEach),但将单个元素视为jQuery 对象(element.hasClass),这就是我在上面第一个sn-p 中所做的。不过,这很奇怪。

【讨论】:

  • 太棒了,非常感谢 TJ!这正是我想要的:)
【解决方案2】:

除了克劳德先生的回答,您还可以通过以下方式使用Array.prototype.reduce

cars.reduce((a, car) => { if(!car.hasClass("filtered-out")) {a++}; return a; }, 0);

或者,“缩小”:

cars.reduce((a, car) => !car.hasClass("filtered-out") && a++, 0);

这还将返回缺少“已过滤”类的汽车数量。如果元素不是 jQuery 对象,则需要在 car 变量周围添加一个额外的 $()

cars.reduce((a, car) => { if(!$(car).hasClass("filtered-out")) {a++}; return a; }, 0);

【讨论】:

    【解决方案3】:

    你可以在没有 jQuery 的情况下做这样的事情

    const cars = document.querySelectorAll('.cars');
    const carFilter = (car) => car.classList.contains('filtered-out');
    const available_cars = [...cars].filter(carFilter);
    console.log(available_cars.length);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      相关资源
      最近更新 更多