typescript 从对象内部的数组中删除项

qij5mzcb  于 2023-04-07  发布在  TypeScript
关注(0)|答案(2)|浏览(240)

如何从对象内部的数组中删除项。
它应该删除所有的爱好是舞蹈。我试图使用拼接。

const people = [{
    id: 1,
    documents: [{
        id: 1,
        category: [{
          hobby: 'soccer'
        }, {
          hobby: 'dance'
        }]
      },
      {
        id: 2,
        category: [{
          hobby: 'soccer'
        }, {
          hobby: 'dance'
        }]
      }
    ]
  },
  {
    id: 2,
    documents: [{
        id: 1,
        category: [{
          hobby: 'dance'
        }, {
          hobby: 'soccer'
        }]
      },
      {
        id: 2,
        category: [{
          hobby: 'soccer'
        }, {
          hobby: 'dance'
        }]
      }
    ]
  }
];
people.forEach(person => {
  person.documents.forEach(document => {
    document.category.forEach((cat, index) => {
      if (cat.hobby === 'dance') {
        document.category.splice(index, 1)
      }
    })
  })
})

console.log(people);
u0sqgete

u0sqgete1#

您的代码几乎是正确的,但是在迭代数组时使用forEach修改数组时会有一个小问题。这可能会导致跳过元素或错误的结果。相反,使用filter方法创建一个新数组,其中只包含不匹配条件的元素。

people.forEach(person => {
person.documents.forEach(document => {
    document.category = document.category.filter(cat => cat.hobby !== 'dance');
})
});

console.log(people);

它使用forEach遍历每个人、文档和类别,但不是直接修改类别数组,而是将类别数组重新分配给一个新数组,其中只包含爱好不是'dance'的元素。这可以防止在迭代数组时修改数组的任何问题。

vojdkbi0

vojdkbi02#

完全没有必要,但我个人喜欢这种任务的集合:

function deleteHobbyFrom(people, hobby) {
  people.forEach(person => {
    person.documents.forEach(document => {
      const catAsSet = new Set(document.category)
      catAsSet.forEach(cat => { 
        cat.hobby && 
        cat.hobby === hobby &&
        catAsSet.delete(cat)
       })
      document.category = Array.from(catAsSet)
    })
  })
}

我不认为我通常会像在这里一样从数组转换到set再转换回数组,但值得考虑使用Set作为数据结构而不是Array。

相关问题