了解如何快速遍历数组并对对象计数很简单。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

以上就是遍历数组的元素,并有条件地对其进行计数的几种方法。现在你应该会对数组计数了!

原文:How to Count Objects in an Array