Проблема с совпадением идентификатора между двумя объектами

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