Как захватить совпадающее значение счетчика в массиве?

#javascript #node.js #arrays

#javascript #node.js #массивы

Вопрос:

У меня есть массив x , который может иметь следующие значения:

 0: {status: "completed", count: 2}
1: {status: "pending", count: 3}
 

Теперь, если статус соответствует pending , я хочу захватить соответствующее count значение.

Я написал следующий код:

 if (x?.length) {
PendingCount = x[1].count;
completedCount = x[0].count;
}
 

Это не всегда дает желаемый результат, потому что не обязательно, чтобы pending статус всегда был в x[0]

Комментарии:

1. Должен ли x быть массивом? Может ли ваша статистика в массиве дублироваться? Если нет, я бы использовал вместо этого объект со статиями в качестве ключей. x = {completed:{count:2},pending:{count:3}}; затем вызовите x[status].count .

Ответ №1:

Я бы использовал Array.prototype.найти, чтобы найти элемент со статусом ожидания, а затем получить его свойство count, например:

 const { count } = x.find(({ status } = {}) => status === 'pending') || {}:
 

Это даст вам подсчет, если существует статус ожидания, или неопределенный, если его нет. Здесь я использовал синтаксис деструктурирования и дефолта, взгляните на статьи, на которые я ссылался, если вы не знакомы с ними.

Ответ №2:

вы можете использовать фильтр, который найдет все элементы, имеющие статус ожидания

 const data = [{
    status: "completed",
    count: 2
  },
  {
    status: "pending",
    count: 3
  }
];

const pending = data.filter(s => s.status === "pending");
console.log(pending.length ? "got pending" : "no pending")
console.log(pending.map(i=>i.count))
 

Комментарии:

1. filter() вернет массив. Вам нужно ссылаться на объект по индексу массива, например pending[0].length .

2. в этом весь смысл, что, если в массиве есть более одного элемента со статусом ожидания

Ответ №3:

Если гарантировано, что будет только 1 элемент с «ожидающим» status , то представляется целесообразным использовать Array.prototype .найти, чтобы найти элемент на основе значения его status свойства:

 const pendingCount = [{
  status: "completed",
  count: 2
}, {
  status: "pending",
  count: 3
}].find(el => el.status === "pending").count;

console.dir(`pending count = ${pendingCount}`); 

Если в массиве есть несколько «ожидающих» элементов, и вам нужно получить сумму всех, вероятно, имеет смысл использовать Array.prototype.filter (для удаления всех не «ожидающих» элементов), а затем Array.prototype.reduce в filter результате, чтобы добавить count s.

 const pendingSum = [{
    status: "completed",
    count: 2
  }, {
    status: "pending",
    count: 3
  }, {
    status: "pending",
    count: 5
  }, {
    status: "pending",
    count: 5
  }]
  .filter(el => el.status === "pending")
  .reduce((sum, el) => sum  = el.count, 0);

console.dir(`sum of pending items count = ${pendingSum}`); 

Ответ №4:

 const array = [
  {status: "completed", count: 2},
  {status: "pending", count: 3}
];

const pending = array.find(s => s.status === "pending");
if (pending) {
   // Do whatever you want.
}