删除数组中的用户

Deleting a user in an Array

kyler 决定删除他的帐户。循环遍历你的数组 对象,直到找到 kyler 的帐户 - 使用 kyler@test.com 在数组中找到他。 找到他所在的特定索引后,将他从数组中删除。

var users = [{
          name: 'talon',
          email: 'talon@test.com',
          password: 'test1234',
          username: 'tdog',
        },{
          name: 'lauren',
          email: 'lauren@test.com',
          password: 'admin1234',
          username: 'ldogg',
        },{
          name: 'cohen',
          email: 'cohen@test.com',
          password: 'baby1234',
          username: 'cdoggy',
        },{
          name: 'kyler',
          email: 'kyler@test.com',
          password: 'delete1234',
          username: 'kdawg'
        }];

这是我目前所拥有的,但我正在旋转我的轮子:

        function deleteUser(arr)
    for (var i = 0; i < users.length; i++) {
            if (arr.indexOf([i]) === 'kyler@test.com') {
                users.slice(arr[i]);
            }
        }

我不确定我的每个用户是否需要在数组中分配一个变量,或者它是否是我的切片。任何指导都会很棒。谢谢

在您的代码中,if 语句将始终是 false,因为 indexOf method returns an integer value and you are comparing it with a string using === so statement would be always false(type mismatch). And the second thing is slice 方法不会更新现有数组,它只会生成数组的浅表副本。

要使您自己的代码正常工作,

  1. 将 if 条件更改为 arr[i].email === 'kyler@test.com'
  2. 使用 Array#splice 方法删除元素,users.splice(i,1);
  3. 删除元素后使用 break.
  4. 打破 for 循环

最终代码:

 function deleteUser(arr)
   for (var i = 0; i < users.length; i++) {
     if (arr[i].email === 'kyler@test.com') {
        users.slice(i, 1);
        break;
     }
   }
 }

使用Array#findIndexArray#splice方法。其中 Array#findIndex 可用于获取元素索引(对于旧浏览器使用简单循环获取索引)和 Array#splice 使用索引删除它的方法。

users.splice(users.findIndex(function(v) {
  return v.email == 'kyler@test.com'
}), 1);

var users = [{
  name: 'talon',
  email: 'talon@test.com',
  password: 'test1234',
  username: 'tdog',
}, {
  name: 'lauren',
  email: 'lauren@test.com',
  password: 'admin1234',
  username: 'ldogg',
}, {
  name: 'cohen',
  email: 'cohen@test.com',
  password: 'baby1234',
  username: 'cdoggy',
}, {
  name: 'kyler',
  email: 'kyler@test.com',
  password: 'delete1234',
  username: 'kdawg'
}];

users.splice(users.findIndex(function(v) {
  return v.email == 'kyler@test.com'
}), 1);

console.log(users);


仅供参考: 对于较旧的浏览器,请检查 polyfill option of findIndex method


更新: 或者使用简单的 while 循环更快和旧浏览器支持的版本;

var len = users.length;
// iterate upto `0`
while (len--) {
  // check the email  value
  if (users.email == 'kyler@test.com') {
    // if true then remove the element and break the while loop
    users.splice(len, 1);
    break;
  }
}

var users = [{
  name: 'talon',
  email: 'talon@test.com',
  password: 'test1234',
  username: 'tdog',
}, {
  name: 'lauren',
  email: 'lauren@test.com',
  password: 'admin1234',
  username: 'ldogg',
}, {
  name: 'cohen',
  email: 'cohen@test.com',
  password: 'baby1234',
  username: 'cdoggy',
}, {
  name: 'kyler',
  email: 'kyler@test.com',
  password: 'delete1234',
  username: 'kdawg'
}];

var len = users.length;
while (len--) {
  if (users[len].email == 'kyler@test.com') {
    users.splice(len, 1);
    break;
  }
}


console.log(users);

因为你想改变原始数组你需要splice

function deleteUser(arr, email) {
  for(var i = 0; i < arr.length; i++) {
     if(arr[i].email === email) {
       arr.splice(i, 1)
       return;
     }
  }
}

您可以使用 Array.prototype.findIndex() 通过提供的测试函数查找数组中元素的索引(在您的情况下,您将检查 email 属性)。 使用 Array.prototype.slice() 删除该特定索引处的对象。

下面的示例,您可以看到具有该特定电子邮件的用户已从原始数组中删除:

var users = [{
  name: 'talon',
  email: 'talon@test.com',
  password: 'test1234',
  username: 'tdog',
}, {
  name: 'lauren',
  email: 'lauren@test.com',
  password: 'admin1234',
  username: 'ldogg',
}, {
  name: 'cohen',
  email: 'cohen@test.com',
  password: 'baby1234',
  username: 'cdoggy',
}, {
  name: 'kyler',
  email: 'kyler@test.com',
  password: 'delete1234',
  username: 'kdawg'
}];

var removeUser = function(data, email) {
  var index = data.findIndex(function(item) {
    return item.email === email;
  });
  data.splice(index, 1);
};
removeUser(users,'kyler@test.com');
console.log(users);