.splice()从数组中删除2个对象而不是1

时间:2017-09-30 07:16:51

标签: javascript arrays loops foreach slice

例如,当输入'John Smith'时,slice会删除前两个员工姓名而不是仅删除John的员工姓名。知道为什么会这样吗?

let removeEmployee = '';
let employees = [
  {
    name: 'John Smith'
  }, {
    name: 'Jackie Jackson'
  }, {
    name: 'Chris Jones'
  }, {
    name: 'Amanda Cullen'
  }, {
    name: 'Jeremy Goodwin'
  }, ]

removeEmployee = prompt('Enter the name of the employee to be removed:');

function employeeExists(employee) {
  return employees.some(function(el) {
    return el.name === employee;
  });
}

if (employeeExists(removeEmployee)) {
  employees.forEach(function(employee, index, object) {
    if (employee.name === removeEmployee) {
      object.splice(index, 1);
    } else {
      console.log(employee.name);
    }
  });
} else {
  console.log('That employee does not exist, please try again.');
}

5 个答案:

答案 0 :(得分:2)

您可以使用filter代替forEach来简化事情:

if (employeeExists(removeEmployee)) {   
    employees = employees.filter(e => e.name !== removeEmployee);
}

如果您仍想使用splice,可以使用findIndex



let employees = [ {name: 'John Smith'}, {name: 'Jackie Jackson'}, {name: 'Chris Jones'}, {name: 'Amanda Cullen'}, {name: 'Jeremy Goodwin'} ];
var removeEmployee = 'Chris Jones';
var index = employees.findIndex(e => e.name === removeEmployee);
employees.splice(index, 1);
console.log(employees);




答案 1 :(得分:2)

杰基杰克逊仍在名单中

你循环遍历这个列表:

1
2
3
4
5

对于您在索引0的第一次尝试。然后删除索引0(John Smith)。 此时 Jackie Jackson是新索引0,但是iterration跳转到下一个元素(索引1),即Chris Jones

新索引0永远不会登出到控制台!但他仍然在名单中!

答案 2 :(得分:1)

只需使用 Array#filter 功能即可删除相关项目。您不需要先检查(迭代),然后循环forEach迭代)。你有2次迭代。您只能在一次迭代中执行此操作。

let employees = [
  { name: 'John Smith', }, 
  { name: 'Jackie Jackson' }, 
  { name: 'Chris Jones' }, 
  { name: 'Amanda Cullen' }, 
  { name: 'Jeremy Goodwin'} 
];

let name = prompt('Enter the name of the employee to be removed:');

employees = employees.filter(emp => emp.name.localeCompare(name));

console.log(employees);

答案 3 :(得分:1)

您可以使用findIndex查找名称与提示输入相同的对象的索引。使用该索引,您可以使用splice从employees数组中删除项目

let removeEmployee = '';
let employees = [{
  name: 'John Smith'
}, {
  name: 'Jackie Jackson'
}, {
  name: 'Chris Jones'
}, {
  name: 'Amanda Cullen'
}, {
  name: 'Jeremy Goodwin'
}, ]


removeEmployee = prompt('Enter the name of the employee to be removed:');

function employeeExists(employee) {
  let ifEmployee = employees.findIndex(function(el) {
    return el.name === employee.trim();
  })
  return ifEmployee;
}
var employeIndex = employeeExists(removeEmployee);
if (employeIndex !== -1) {
  employees.splice(employeIndex, 1)
} else {
  console.log('That employee does not exist, please try again.');
}
console.log(employees)

答案 4 :(得分:1)

forEach中不需要第三个第三个参数。只需splice employees数组,如下所示。

let removeEmployee = '';
let employees = [{
  name: 'John Smith'
}, {
  name: 'Jackie Jackson'
}, {
  name: 'Chris Jones'
}, {
  name: 'Amanda Cullen'
}, {
  name: 'Jeremy Goodwin'
}, ]

// let letters = ['a', 'd', 'c']
removeEmployee = prompt('Enter the name of the employee to be removed:');

function employeeExists(employee) {
  return employees.some(function(el) {
    return el.name === employee;
  });
}

if (employeeExists(removeEmployee)) {
  employees.forEach(function(employee, index) {

    if (employee.name === removeEmployee) {
      employees.splice(index, 1);
    } else {
      console.log(employee.name);
    }
  });
} else {
  console.log('That employee does not exist, please try again.');
}

console.log(employees)