【问题标题】:.splice() is removing 2 objects from array instead of 1.splice() 正在从数组中删除 2 个对象而不是 1 个
【发布时间】:2018-03-12 01:08:17
【问题描述】:
例如,当输入“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.');
}
【问题讨论】:
标签:
javascript
arrays
loops
foreach
slice
【解决方案1】:
您可以使用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);
【解决方案2】:
杰基杰克逊仍在名单中
您可以像这样遍历列表:
1
2
3
4
5
对于第一次迭代,您位于索引 0。然后删除索引0 (John Smith)。 此时 Jackie Jackson 是新的索引0 但迭代会跳转到下一个元素(索引1),Chris Jones 是什么。
新的索引 0 永远不会注销到控制台!但他还在名单上!
【解决方案3】:
您可以使用findIndex 查找名称与提示输入相同的对象的索引。使用该索引,您可以使用 splice 从员工数组中删除项目
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】:
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)
【解决方案5】:
只需使用 Array#filter 函数即可删除项目。您无需先检查 (iteration),然后使用 forEach(iteration) 循环。您有 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);