Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个对象之间的Id匹配问题_Javascript_Node.js - Fatal编程技术网

Javascript 两个对象之间的Id匹配问题

Javascript 两个对象之间的Id匹配问题,javascript,node.js,Javascript,Node.js,为什么param生成了太多的对象,而它最多应该是4个对象。它应该在dbData.Items[dbItemIndex].Id==lineId之间匹配Id,并将元数据存储在param中,包括dbData数组索引 const dbData={ 项目:[ {Id:111}, {Id:222}, {Id:333}, {Id:111}, ] } 常量有效载荷={ 线路:[ {LineId:111}, {LineId:222}, {LineId:333}, {LineId:111}, ] } 函数updat

为什么
param
生成了太多的对象,而它最多应该是4个对象。它应该在
dbData.Items[dbItemIndex].Id==lineId
之间匹配Id,并将元数据存储在
param
中,包括
dbData
数组索引

const dbData={
项目:[
{Id:111},
{Id:222},
{Id:333},
{Id:111},
]
}
常量有效载荷={
线路:[
{LineId:111},
{LineId:222},
{LineId:333},
{LineId:111},
]
}
函数updateDbSent(){
常量参数=[];
sentPayload.Lines.forEach((行)=>{
设lineId=line.lineId
for(dbData.Items中的const dbItemIndex){
if(dbData.Items[dbItemIndex].Id==lineId){
参数推({
索引:dbItemIndex,
是的,
Id:lineId,
})
}
}
});
//更新数据库
控制台日志(param);
}

updateDbSent()
您可以从客户端删除重复项以获得正确的输出

目前,在DB中检查两次相同的有效负载ID(在本例中为1111) 要删除重复项,可以使用集合

const lineIds = new Set();
sentPayload.Lines.forEach(lineIdObj => lineIds.add(lineIdObj.LineId))
现在,只需像您在当前代码中所做的那样,在
lineid
上循环即可

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

您可以从客户机负载中删除重复项以获得正确的输出

目前,在DB中检查两次相同的有效负载ID(在本例中为1111) 要删除重复项,可以使用集合

const lineIds = new Set();
sentPayload.Lines.forEach(lineIdObj => lineIds.add(lineIdObj.LineId))
现在,只需像您在当前代码中所做的那样,在
lineid
上循环即可

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

在foreach中使用回路和蓄能器的磨合,并推动蓄能器

const dbData={
项目:[
{Id:111},
{Id:222},
{Id:333},
{Id:111},
]
}
常量有效载荷={
线路:[
{LineId:111},
{LineId:222},
{LineId:333},
{LineId:111},
]
}
函数updateDbSent(){
常量参数=[];
sentPayload.Lines.forEach((行,累加器)=>{
设lineId=line.lineId;
for(dbData.Items中的const dbItemIndex){
if(dbData.Items[dbItemIndex].Id==lineId){
参数推({
索引:累加器,
是的,
Id:lineId,
});
打破
}
}
});
//更新数据库
控制台日志(param);
}

updateDbSent()
在foreach和push累加器中对循环和累加器使用中断

const dbData={
项目:[
{Id:111},
{Id:222},
{Id:333},
{Id:111},
]
}
常量有效载荷={
线路:[
{LineId:111},
{LineId:222},
{LineId:333},
{LineId:111},
]
}
函数updateDbSent(){
常量参数=[];
sentPayload.Lines.forEach((行,累加器)=>{
设lineId=line.lineId;
for(dbData.Items中的const dbItemIndex){
if(dbData.Items[dbItemIndex].Id==lineId){
参数推({
索引:累加器,
是的,
Id:lineId,
});
打破
}
}
});
//更新数据库
控制台日志(param);
}

updateDbSent()
您的解决方案看起来有点复杂。我会建议一个解决方案,利用减少和发现指数如下

const dbData = {
 Items: [{ Id: 111 }, { Id: 222 }, { Id: 333 }, { Id: 111 }],
};

const sentPayload = {
  Lines: [{ LineId: 111 }, { LineId: 222 }, { LineId: 333 }, { LineId: 111 }],
};

在作者指出我的解决方案不能使用重复的Id后更新实现。我更新了解决方案,使用reduce并将索引和Id组合作为键

function updateDbSent() {
  const result = sentPayload.Lines.reduce((acc, line, lineIndex) => {
    const { LineId } = line;
    const Index = dbData.Items.findIndex(
      (item, itemIndex) => item.Id === LineId && !acc[`${line} - ${itemIndex}`]
    );
    acc[`${line} - ${Index}`] = {
      Index,
      Id: LineId,
      Sent: true,
    };
    return acc;
  }, {});
  return Object.values(result);
  //update db
}

console.log(updateDbSent());

您的解决方案看起来有点复杂。我会建议一个解决方案,利用减少和发现指数如下

const dbData = {
 Items: [{ Id: 111 }, { Id: 222 }, { Id: 333 }, { Id: 111 }],
};

const sentPayload = {
  Lines: [{ LineId: 111 }, { LineId: 222 }, { LineId: 333 }, { LineId: 111 }],
};

在作者指出我的解决方案不能使用重复的Id后更新实现。我更新了解决方案,使用reduce并将索引和Id组合作为键

function updateDbSent() {
  const result = sentPayload.Lines.reduce((acc, line, lineIndex) => {
    const { LineId } = line;
    const Index = dbData.Items.findIndex(
      (item, itemIndex) => item.Id === LineId && !acc[`${line} - ${itemIndex}`]
    );
    acc[`${line} - ${Index}`] = {
      Index,
      Id: LineId,
      Sent: true,
    };
    return acc;
  }, {});
  return Object.values(result);
  //update db
}

console.log(updateDbSent());

重复Id的索引将是错误的。例如,最后一个Id为111将是3ah ok的索引,这可以作为条件添加到findIndex中。我可以update@I'我会回来查看我的最新解决方案,看看它是否适用于您重复Id的索引将是错误的。例如,最后一个Id为111将是3ah ok的索引,这可以作为条件添加到findIndex中。我可以update@I'我会回来查看我的最新解决方案,看看它是否适合您