#javascript #node.js
#javascript #node.js
Вопрос:
Почему param
было сгенерировано слишком много объектов, когда должно быть не более 4 объектов. Он должен совпадать с идентификатором dbData.Items[dbItemIndex].Id == lineId
и хранить метаданные, param
включая dbData
индекс массива.
const dbData = {
Items: [
{Id: 111},
{Id: 222},
{Id: 333},
{Id: 111},
]
}
const sentPayload = {
Lines: [
{LineId: 111},
{LineId: 222},
{LineId: 333},
{LineId: 111},
]
}
function updateDbSent() {
const param = [];
sentPayload.Lines.forEach((line) => {
let lineId = line.LineId
for (const dbItemIndex in dbData.Items) {
if (dbData.Items[dbItemIndex].Id == lineId) {
param.push({
Index: dbItemIndex,
Sent: true,
Id: lineId,
})
}
}
});
//update db
console.log(param);
}
updateDbSent()
Я ожидал, что будет:
[
{
"Index": "0",
"Sent": true,
"Id": 111
},
{
"Index": "1",
"Sent": true,
"Id": 222
},
{
"Index": "2",
"Sent": true,
"Id": 333
},
{
"Index": "3",
"Sent": true,
"Id": 111
}
]
Ответ №1:
Ваше решение выглядит немного сложным. Я бы предложил решение, которое использует reduce и find index следующим образом
const dbData = {
Items: [{ Id: 111 }, { Id: 222 }, { Id: 333 }, { Id: 111 }],
};
const sentPayload = {
Lines: [{ LineId: 111 }, { LineId: 222 }, { LineId: 333 }, { LineId: 111 }],
};
обновите реализацию после того, как автор указал, что мое решение не работает с дублированным идентификатором. Я обновил решение, чтобы вместо этого использовать комбинацию reduce и make index и id в качестве ключа
function updateDbSent() {
const result = sentPayload.Lines.reduce((acc, line, lineIndex) => {
const { LineId } = line;
const Index = dbData.Items.findIndex(
(item, itemIndex) => item.Id === LineId amp;amp; !acc[`${line} - ${itemIndex}`]
);
acc[`${line} - ${Index}`] = {
Index,
Id: LineId,
Sent: true,
};
return acc;
}, {});
return Object.values(result);
//update db
}
console.log(updateDbSent());
Комментарии:
1. Индекс будет неправильным для дублированного идентификатора. Например, последний идентификатор 111 будет иметь индекс 3
2. хорошо, это можно добавить в качестве условия в findIndex. Я могу обновить
3. @I’ll-Be-Back ознакомьтесь с моим последним решением, чтобы узнать, работает ли оно для вас
Ответ №2:
Вы можете удалить дубликаты из вашего клиента sentPayload, чтобы получить правильный вывод.
В настоящее время одни и те же идентификаторы полезной нагрузки дважды проверяются в БД (в данном случае 1111) Для удаления дубликатов вы можете использовать Set .
const lineIds = new Set();
sentPayload.Lines.forEach(lineIdObj => lineIds.add(lineIdObj.LineId))
Теперь просто повторите цикл lineIds
, как вы делали в своем текущем коде.
function updateDbSent() {
const param = [];
lineIds.forEach((lineId) => {
for (const dbItemIndex in dbData.Items) {
if (dbData.Items[dbItemIndex].Id == lineId) {
param.push({
Index: dbItemIndex,
Sent: true,
Id: lineId,
})
}
}
});
//update db
console.log(param);
}
Ответ №3:
Используйте перерыв в цикле for и накопителе в foreach и нажимайте накопитель
const dbData = {
Items: [
{ Id: 111 },
{ Id: 222 },
{ Id: 333 },
{ Id: 111 },
]
}
const sentPayload = {
Lines: [
{ LineId: 111 },
{ LineId: 222 },
{ LineId: 333 },
{ LineId: 111 },
]
}
function updateDbSent() {
const param = [];
sentPayload.Lines.forEach((line, accumulator ) => {
let lineId = line.LineId;
for (const dbItemIndex in dbData.Items) {
if (dbData.Items[dbItemIndex].Id == lineId) {
param.push({
Index: accumulator ,
Sent: true,
Id: lineId,
});
break;
}
}
});
//update db
console.log(param);
}
updateDbSent()