#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.
}