【问题标题】:Splice() method removes end of array not at indexSplice() 方法删除不在索引处的数组末尾
【发布时间】:2020-07-08 23:08:27
【问题描述】:

我的功能removeItems() 是从 li 元素内的列表项中删除项目。目前我可以从视图中删除该项目,但数组拼接方法会从数组末尾而不是索引处删除元素。

我的代码是:

var data = [
    "Tuesday ",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday", 
    "Sunday"
];

function itemArray(ele) {
    let items = ''; 
    for (let i = 0; i < ele.length; i++) {
        items += `<li>${ele[i]} <button type='button' class='removeItem'>Remove Item</button> </li>`;
    }
    return items;
}

function addItemFunction () {
    const addButton = document.getElementById('addButton');
    const input = document.getElementById('input').value;
    data.push(input);    
    htmlInside(data);  
}

function removeItemFunction() {
    data.pop(data);    
    htmlInside(data);
}

function removeItems() {
    const listUl = main.querySelector('ul');
    listUl.addEventListener('click', (event) => {
        if (event.target.tagName == 'BUTTON') {
          let li = event.target.parentNode;
          let ul = li.parentNode;
          ul.removeChild(li);
          var index = data.indexOf(data);
          data.splice(index, 1);
          console.log(data);
        }
      });
}

function htmlInside(data) {
        let getHtml = `
    <ul class="listItems">
        ${itemArray(data)}
        
    </ul>
    <input type='input' id='input' required></input><button type='button' id='addButton'>Add item</button><button id='removeButton'>Remove item</button>
    
    `
    document.querySelector('.hero').innerHTML = getHtml;

    addButton.addEventListener('click', function () {
        addItemFunction();
    });

    removeButton.addEventListener('click', function () {
        removeItemFunction();
    });

    removeItems();

 }  

我认为我没有正确找到数据的索引。可能是var index = data.indexOf(this); data.splice(index, 1);的问题

当我console.log(index) 它的日志-1。

【问题讨论】:

  • splice 的第二个参数是要删除多少元素。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 它正在删除正确的数量,即 1
  • data.indexOf(data); var x = []; x.push(x);
  • 是的,所以我确定我没有正确获取索引...对 indexOf 做的不多
  • 所以试图通读这个。看起来您的意图是,当单击按钮时,您会从数据中删除其中一个值。准确吗?

标签: javascript arrays indexof array-splice


【解决方案1】:

问题出在var index = data.indexOf(data) 这一行中,您正在检查数据的索引,您应该检查数据数组中元素的索引,因此您应该首先使用ele=li.textContent 之类的内容从列表中获取该元素,然后然后将其传递给data.indexOf(ele)

【讨论】:

  • 所以我应该寻找
  • 元素,然后将其传递给 indexOf?但是拼接方法不应该直接从数组中删除吗?
  • 是的,但它应该通过传递要删除的元素的索引以及要从该索引开始删除的元素数来删除,在您的情况下,您传递的是数组的索引而不是数组中的元素,所以你应该做的是当你按下删除按钮时从列表中获取 textContent 这将是你要从数组中删除的元素,因此你检查目标列表的 indexOf textContent .这有意义吗?
  • 是的,但是我已经根据您的建议更改了代码:更改为 var ele = li.textContent;var index = data.indexOf(ele);console.log(ele); data.splice(index, 1); 所以控制台记录了选择的正确项目,但是拼接仍然从数组末尾删除该项目。
  • 代码中的问题是 2 首先li.textContent 返回当天的名称和一些额外的文本,所以我刚刚从字符串中提取了当天的名称,第二个问题是在您的数据中周二的数组中有一些额外的空间,所以我修复了这里所有的工作代码stackblitz
  • 是的,这是正确的,我拆分字符串的原因是从字符串中提取日期,您可以使用任何其他方法来实现您可以使用切片或子字符串或正则表达式但最对于这种情况,我认为有效的是分裂。如果您还有问题,请告诉我
  • 【解决方案2】:

    在点击事件监听器中,console.logdata.splice(index, 1)返回的值。你应该看到的是-1。现在,如果您将 -1 放入拼接中,它将从末端向后开始,在这种情况下是最后一个元素并将其删除。

    这是因为 .indexOf 方法在发现空无时返回 -1,这里就是这种情况。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签