【问题标题】:.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);

            【讨论】:

              猜你喜欢
              • 2021-05-04
              • 1970-01-01
              • 1970-01-01
              • 2021-10-06
              • 2016-10-28
              • 2020-08-22
              • 2019-04-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多