首页 > 解决方案 > JS indexOf 对象数组和 splice() 未删除正确的对象

问题描述

我有一个像这样的对象数组:

"followers": [
        {
            "id": "1be87842-2f7f-4e3b-8fde-9a998feb3a01",
            "bug_id": "4ae2707b-07ef-4e07-95da-77855c67fece",
            "user_id": "e9e81aa2-4994-483d-a3a7-3b88491f1fda",
            "username": "texample1",
            "name": "Test Example1",
            "created_at": "2018-11-27 21:01:42",
            "updated_at": "2018-11-27 21:01:42",
            "deleted_at": null
        },
        {
            "id": "7bd1fa5f-4109-4beb-b53a-fb03a1d23536",
            "bug_id": "4ae2707b-07ef-4e07-95da-77855c67fece",
            "user_id": "e9e81aa2-4994-483d-a3a7-3b88491f1fda",
            "username": "texample1",
            "name": "Test Example2",
            "created_at": "2018-11-27 21:01:48",
            "updated_at": "2018-11-27 21:01:48",
            "deleted_at": null
        }
    ]

我正在尝试使用我的 vuex 商店中的以下代码通过它的索引删除一个对象:

  let followersArray = state.bugs.find(b => b.id === follower.bug_id).followers
  let index = followersArray.indexOf(follower)
  followersArray.splice(index, 1)

我将整个追随者对象传递给这个突变,然后在错误对象上找到追随者数组,找到索引并尝试从完整的错误对象的追随者对象数组中拼接它。此代码从错误中删除了另一个追随者。索引记录为 -1,它应该是 1。有人看到我在这里缺少什么吗?如果我能得到正确的索引,我也会if(index !== -1))在那里添加一个。

标签: javascriptvue.jsecmascript-6vuejs2vuex

解决方案


当您运行此代码并返回-1

let index = followersArray.indexOf(follower);

这意味着该follower对象不包含在followersArray. followersArray可能包含对象的副本——follower而不是对同一对象的引用。

即使对象与 中的follower对象具有相同的属性和属性值followersArray[1]indexOf也会返回 a -1,除非它们是完全相同的对象。

现在,如果您只想在数组中找到一个具有匹配属性值(例如id)的对象,那么您可以使用maporfindIndex来执行此操作:

let index = followersArray.map(i => i.id).indexOf(follower.id);


推荐阅读