了解如何快速遍历数组并对对象计数很简单。length()
方法将告诉你数组中值的总数。但是如果你只想根据某些条件对这些值进行计数,怎么办呢?
假设有一个像这样的数组:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
你只想计算 status
为 '0'
的对象的数量。
就像编程中的几乎所有内容一样,有很多方法可以实现这一点。我们将在下面介绍几种常见的方法。
使用 for
循环
最简单的方法可能是声明一个 counter
变量,循环遍历数组,并且仅在 status
等于 '0'
时才迭代 counter
:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
let counter = 0;
for (let i = 0; i < storage.length; i++) {
if (storage[i].status === '0') counter++;
}
console.log(counter); // 6
你可以使用 for...of
循环简化这个过程:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
let counter = 0;
for (const obj of storage) {
if (obj.status === '0') counter++;
}
console.log(counter); // 6
另外,如果要对其他对象数组有条件地计数,则可以创建一个函数来执行相同的操作:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
function statusCounter(inputs) {
let counter = 0;
for (const input of inputs) {
if (input.status === '0') counter += 1;
}
return counter;
}
statusCounter(storage); // 6
使用数组方法
对于数组,JavaScript 有许多有用的方法,可以链接到一个数组,并在迭代数组中的元素时传递不同的参数以供使用。
我们来看一下其中两个方法:filter()
和 reduce()
。
filter()
filter 方法就是这样做的——遍历数组中的每个元素,并过滤掉所有不符合你提供的条件的元素。然后,它将返回一个新数组,其中包含根据你的条件返回 true 的所有元素。
例如:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.filter(function(item){
if (item.status === 0) {
return true;
} else {
return false;
}
});
/*
[
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' }
]
*/
过滤掉 status: '1'
的对象后,只需在新数组上调用 length()
方法,即可获取 status: '1'
的对象的总数:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.filter(function(item){
if (item.status === 0) {
return true;
} else {
return false;
}
}).length; // 6
可以用 ES6 语法简化这个过程:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.filter(item => item.status === '0').length; // 6
reduce()
将 reduce()
方法想像成瑞士军刀,它非常灵活,可以让你将数组作为输入并将其转换为几乎任何东西。更好的是,像 filter()
一样,这个方法返回一个新数组,而原来的数组保持不变。
你可以在本文中阅读有关 reduce()
的更多信息。
要实现上面的需求,我们需要一个数组,检查它的内容,并产生一个数字。这是一种简单的方法:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.reduce((counter, obj) => {
if (obj.status === '0') counter += 1
return counter;
}, 0); // 6
你可以使用 ES6 语法和三元运算符进一步简化操作:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.reduce((counter, obj) => obj.status === '0' ? counter += 1 : counter, 0); // 6
使用对象解构:
const storage = [
{ data: '1', status: '0' },
{ data: '2', status: '0' },
{ data: '3', status: '0' },
{ data: '4', status: '0' },
{ data: '5', status: '0' },
{ data: '6', status: '0' },
{ data: '7', status: '1' },
];
const count = storage.reduce((counter, { status }) => status === '0' ? counter += 1 : counter, 0); // 6
以上就是遍历数组的元素,并有条件地对其进行计数的几种方法。现在你应该会对数组计数了!