为了账号安全,请及时绑定邮箱和手机立即绑定

删除特定对象后在对象中从数组中设置新序列

删除特定对象后在对象中从数组中设置新序列

Qyouu 2021-10-29 16:33:25
我的目标: 我需要在 sequenceIndex 中有一个连续的数字序列,它是我对象中的一个值。因此,当我删除特定对象时,其他对象的序列索引当然不再连续了。正在根据特定值检查我删除的对象,以查看数组中是否还有其他对象共享相同的值(第二个 if 语句)。如果是这样,那么应该有一个连续的新值集。输出是 if 语句中的迭代器对于所有操作的对象始终相同。由此:const objectsArray = [  {    folder: "folderName",    documents: [      {        id: 0,        sequenceIndex: "0",        documentType: "letter"      },      {        id: 1,        sequenceIndex: "1",        documentType: "letter"      },      {        id: 2,        sequenceIndex: "2",        documentType: "letter"      },      {        id: 3,        sequenceIndex: "3",        documentType: "letter"      }    ]  }];通过删除 id 1 和 2,我想解决这个问题(请参阅连续序列索引):const desiredObjectsArray = [  {    folder: "folderName",    documents: [      {        id: 0,        sequenceIndex: "0",        documentType: "letter"      },      {        id: 3,        sequenceIndex: "1",        documentType: "letter"      }    ]  }];到目前为止我的代码:case ActionType.RemoveDocumentInSpecificFolder:        return state.map(file => {          // if in the correct folder remove the object with the delivered id          if (file.folder=== folder) {            remove(file.documents, {              id: action.payload.documents[0].id            });            // create newObjArray from objects which share a specific value and replace the sequence index by new value            const newObjArray = file.documents.map((obj: any) => {              // if the object has the specific value create new object with new sequenceIndex              if (obj.documentType === action.payload.documents[0].documentType) {                //poor attempt to create a sequence                let i = 0;                const correctedSequenceDocObject = { ...obj, sequenceIndex: i };                i++;                return correctedSequenceDocObject;              }我希望有人能指导我朝着正确的方向前进。我也将永远感谢最佳实践的建议:)
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

正如评论:

这是 .filter().map() 有用的经典案例。过滤数据,然后使用 .map((o, i) => ({ ...obj, sequenceIndex: i+1 }) )

以下是示例:

const objectsArray = [{

  folder: "folderName",

  documents: [{

      id: 0,

      sequenceIndex: "0",

      documentType: "letter"

    },

    {

      id: 1,

      sequenceIndex: "1",

      documentType: "letter"

    },

    {

      id: 2,

      sequenceIndex: "2",

      documentType: "letter"

    },

    {

      id: 3,

      sequenceIndex: "3",

      documentType: "letter"

    }

  ]

}];

const ignoreIds = [1, 2]

const updatedDocs = objectsArray[0].documents

  .filter(({

    id

  }) => !ignoreIds.includes(id))

  .map((doc, index) => ({ ...doc,

    sequenceIndex: index

  }));


console.log(updatedDocs)

现在让我们介绍您的尝试


const newObjArray = file.documents.map((obj: any) => {

  // For all the unmatching objects, you will have undefined as object as you are using `.map`

  // This will make you `newObjArray: Array<IDocument | undefined>` which can break your code.

  if (obj.documentType === action.payload.documents[0].documentType) {


    // This will set it as 0 in every iteration making i as 0 always.

    let i = 0;

    const correctedSequenceDocObject = { ...obj, sequenceIndex: i };

    i++;

    return correctedSequenceDocObject;


  }

  return { ...obj };

});

单循环的替代:


主意:

使用创建一个循环Array.reduce并将一个空白数组作为列表传递给它。

添加一个检查并在其中将值推送到此列表。

对于sequenceIndex,获取最后一个元素并获取其sequenceIndex. 添加一个并重新设置。

const newObjArray = file.documents.reduce((acc: Array<IDocument>, obj: any) => {

  if (obj.documentType === action.payload.documents[0].documentType) {

    const sequenceIndex: number = (!!acc[acc.length - 1] ? acc[acc.length - 1].sequenceIndex : 1) + 1;

    acc.push({ ...obj, sequenceIndex });

  }

  return acc;

});


查看完整回答
反对 回复 2021-10-29
?
月关宝盒

TA贡献1772条经验 获得超5个赞

你可以使用filter和map这样的东西


const arr = [{folder: "folderName",documents: [{id: 0,sequenceIndex: "0",documentType: "letter"},{id: 1,sequenceIndex: "1",documentType: "letter"},{id: 2,sequenceIndex: "2",documentType: "letter"},{id: 3,sequenceIndex: "3",documentType: "letter"}]}];


let getInSequence = (filterId) => {

  return arr[0].documents.filter(({ id }) => !filterId.includes(id))

               .map((v, i) => ({ ...v, sequenceIndex: i }))

}


console.log(getInSequence([1, 2]))


查看完整回答
反对 回复 2021-10-29
?
波斯汪

TA贡献1811条经验 获得超4个赞

我现在用来解决这个问题的解决方案是:


            let count = 0;

            const newObject = file.documents.map(obj => {

              if (obj.documentType === firstDocument.documentType) {

                count++;

                return { ...obj, sequenceIndex: count - 1 };

              }

              return obj;

            });

由于不同的 documentType,提供的两个答案都无法处理不感兴趣的对象,因此他们删除了对象。使用此解决方案,我正在检查最后一个元素并增加计数,如果最后一个元素是相同的 documentType。


查看完整回答
反对 回复 2021-10-29
  • 3 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信