Перенастройка одного значения объекта массива из функции map при троичном условии. Проблема в том, что оно возвращает оба условия

#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);