JavaScript forEach语法和长度

JavaScript forEach语法和长度,javascript,jquery,arrays,foreach,refactoring,Javascript,Jquery,Arrays,Foreach,Refactoring,我正在遍历整个cars数组,并查看未过滤出类的对象的数量。是否可以简化此语法?我知道在jQuery中,可以对元素执行类似的操作: $("element").hasClass("filtered-out").length; 我的代码: 您可以使用过滤器: ES2015+箭头功能更简洁: var available_cars = cars.filter(car => !car.hasClass("filtered-out")).length; 如果您可以将cars设置为jQ

我正在遍历整个cars数组,并查看未过滤出类的对象的数量。是否可以简化此语法?我知道在jQuery中,可以对元素执行类似的操作:

        $("element").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 objects element.hasClass,所以这就是我在上面的第一个代码段中所做的。不过这很奇怪。

除了Crowder先生的答案之外,你还可以用以下方式:

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);

您可以在没有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);

你可以将它与investibe Array.prototype.filter一起使用,它是为了实现你的目标:我认为没有更好的方法了。我觉得你很好!太棒了,非常感谢TJ!这正是我想要的:
cars.reduce((a, car) => { if(!$(car).hasClass("filtered-out")) {a++}; return a; }, 0);
const cars = document.querySelectorAll('.cars');
const carFilter = (car) => car.classList.contains('filtered-out');
const available_cars = [...cars].filter(carFilter);
console.log(available_cars.length);