#javascript #node.js #reactjs
#javascript #node.js #reactjs
Вопрос:
Вот фрагмент кода, который я хочу вернуть идентификатор поставщика при условии, если дата меньше или равна rounddate, тогда он должен вернуть идентификатор поставщика
const currentRound = 0;
const roundDate = new Date('2021-12-02T10:41:57.133Z');
const offers = [
{
by: 'supplier',
user_Id: '46a065f05229450e805a0a38d94b0956',
supplier_id: '7a444fea780d90ddc7c35e09104c73b0',
total: 14700,
round: 0,
at: '2021-12-01T10:46:52.278Z',
},
{
by: 'supplier',
user_Id: '6fb6562bd52fd70b3f43aea1da76de16',
supplier_id: 'abc7c8e6b5acc1888ebf5d2398c44d0b',
total: 14800,
round: 0,
at: '2021-12-03T04:59:45.137Z',
},
];
const suppliersWhoSubmitBid = offers.map((e) =>
e.round === currentRound amp;amp; new Date(e.at) <= roundDate amp;amp; e.supplier_id
);
ожидаемый результат = [ ‘7a444fea780d90ddc7c35e09104c73b0’ ]
фактический результат = [‘7a444fea780d90ddc7c35e09104c73b0’, false]
Ответ №1:
Когда вы не выдаете результат для каждого ввода, это не операция сопоставления, это операция фильтрации (за которой в данном случае следует операция сопоставления). Итак, вы бы использовали filter
, тогда map
:
const suppliersWhoSubmitBid = offers
.filter(e => e.round === currentRound amp;amp; new Date(e.at) <= roundDate)
.map(e => e.supplier_id);
Живой пример:
const currentRound = 0;
const roundDate = new Date("2021-12-02T10:41:57.133Z");
const offers = [
{
by: "supplier",
user_Id: "46a065f05229450e805a0a38d94b0956",
supplier_id: "7a444fea780d90ddc7c35e09104c73b0",
total: 14700,
round: 0,
at: "2021-12-01T10:46:52.278Z"
},
{
by: "supplier",
user_Id: "6fb6562bd52fd70b3f43aea1da76de16",
supplier_id: "abc7c8e6b5acc1888ebf5d2398c44d0b",
total: 14800,
round: 0,
at: "2021-12-03T04:59:45.137Z",
}
];
const suppliersWhoSubmitBid = offers
.filter(e => e.round === currentRound amp;amp; new Date(e.at) <= roundDate)
.map(e => e.supplier_id);
console.log(suppliersWhoSubmitBid);
Или, если массив был действительно большим или просто по соображениям стиля, вы могли бы использовать цикл для выполнения одного прохода, а не двух:
const suppliersWhoSubmitBid = [];
for (const e of offers) {
if (e.round === currentRound amp;amp; new Date(e.at) <= roundDate) {
suppliersWhoSubmitBid.push(e.supplier_id);
}
}
Живой пример:
const currentRound = 0;
const roundDate = new Date("2021-12-02T10:41:57.133Z");
const offers = [
{
by: "supplier",
user_Id: "46a065f05229450e805a0a38d94b0956",
supplier_id: "7a444fea780d90ddc7c35e09104c73b0",
total: 14700,
round: 0,
at: "2021-12-01T10:46:52.278Z"
},
{
by: "supplier",
user_Id: "6fb6562bd52fd70b3f43aea1da76de16",
supplier_id: "abc7c8e6b5acc1888ebf5d2398c44d0b",
total: 14800,
round: 0,
at: "2021-12-03T04:59:45.137Z",
}
];
const suppliersWhoSubmitBid = [];
for (const e of offers) {
if (e.round === currentRound amp;amp; new Date(e.at) <= roundDate) {
suppliersWhoSubmitBid.push(e.supplier_id);
}
}
console.log(suppliersWhoSubmitBid);
Просто для полноты картины: в коде JavaScript мы вроде как привыкли иметь дело с массивами вещей, но в JavaScript итераторы и итераторы являются первоклассной концепцией с ES2015, и такого рода комбинированные операции — это то, где итеративность может быть действительно полезной. Предположим, у вас есть две повторно используемые функции генератора утилит:
function* filter(iterable, predicate) {
for (const entry of iterable) {
if (predicate(entry)) {
yield entry;
}
}
}
function* map(iterable, mapper) {
for (const entry of iterable) {
yield mapper(entry);
}
}
Они оба принимают итеративные значения (например, массивы). Первое выдает (производит) только записи, для которых функция предиката возвращает истинное значение, а второе выдает отображенное / преобразованное значение. Затем мы могли бы использовать его для создания итерации совпадающих идентификаторов поставщиков:
const suppliersWhoSubmitBidIterable = map(
filter(offers, e => e.round === currentRound amp;amp; new Date(e.at) <= roundDate),
e => e.supplier_id
);
Или, если конечным результатом должен быть массив, мы распределяем итерацию в массив:
const suppliersWhoSubmitBid = [...map(
filter(offers, e => e.round === currentRound amp;amp; new Date(e.at) <= roundDate),
e => e.supplier_id
)];
Живой пример:
const currentRound = 0;
const roundDate = new Date("2021-12-02T10:41:57.133Z");
const offers = [
{
by: "supplier",
user_Id: "46a065f05229450e805a0a38d94b0956",
supplier_id: "7a444fea780d90ddc7c35e09104c73b0",
total: 14700,
round: 0,
at: "2021-12-01T10:46:52.278Z"
},
{
by: "supplier",
user_Id: "6fb6562bd52fd70b3f43aea1da76de16",
supplier_id: "abc7c8e6b5acc1888ebf5d2398c44d0b",
total: 14800,
round: 0,
at: "2021-12-03T04:59:45.137Z",
}
];
function* filter(iterable, predicate) {
for (const entry of iterable) {
if (predicate(entry)) {
yield entry;
}
}
}
function* map(iterable, mapper) {
for (const entry of iterable) {
yield mapper(entry);
}
}
const suppliersWhoSubmitBid = [...map(
filter(offers, e => e.round === currentRound amp;amp; new Date(e.at) <= roundDate),
e => e.supplier_id
)];
console.log(suppliersWhoSubmitBid);