JavaScript 列表比较和 CRUD

JavaScript List Comparison and CRUD

背景

我正在尝试创建一个订购系统。第一个数组包含 6 个项目(5 个索引),第二个数组为空。当用户单击 html 项目时,它会将项目名称从 array1 添加到 array2。我试图让它动态化,所以如果用户选择了一个项目并且它在 array2 中,这个索引将被删除,如果没有,那么将被添加。

问题

即使在调试并确保它更容易理解之后,我也找不到列表出错的原因。奇怪的随机 js 根本不工作甚至工作,然后给出错误,如添加“,”字符等。

数组

这些是所有函数都可以访问的 2 个数组:

const all_items = ['some item 1', 'some item 2', 'some item 3', 'some item 4', 'some item 5', 'some item 6'];
const order_items = [];

功能:点击项目时

当一个项目被点击时,这个函数被调用。

function item_click(item) {
    if (item == 0) {
        if (isItemInOrder(all_items[0])) {
            var itemid = findItemIndex(all_items[0]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item0").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[0]);
            document.getElementById("item0").className += " bg:gray-100";
        }
    } else if (item == 1) {
        if (isItemInOrder(all_items[1])) {
            var itemid = findItemIndex(all_items[1]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item1").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[1]);
            document.getElementById("item1").className += " bg:gray-100";
        }
    } else if (item == 2) {
        if (isItemInOrder(all_items[2])) {
            var itemid = findItemIndex(all_items[2]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item2").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[2]);
            document.getElementById("item2").className += " bg:gray-100";
        }
    } else if (item == 3) {
        if (isItemInOrder(all_items[3])) {
            var itemid = findItemIndex(all_items[3]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item3").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[3]);
            document.getElementById("item3").className += " bg:gray-100";
        }
    } else if (item == 4) {
        if (isItemInOrder(all_items[4])) {
            var itemid = findItemIndex(all_items[4]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item4").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[4]);
            document.getElementById("item4").className += " bg:gray-100";
        }
    } else if (item == 5) {
        if (isItemInOrder(all_items[5])) {
            var itemid = findItemIndex(all_items[5]);
            delete order_items[itemid];
            order_items = order_items.filter(element => {
                return element !== null;
            });
            document.getElementById("item5").classList.remove('bg:gray-100');
        } else {
            order_items.push(all_items[5]);
            document.getElementById("item5").className += " bg:gray-100";
        }
    }
}

功能:查找数组中项目的索引

function findItemIndex(itemName) {
    for (var i = 0; i < order_items.length; i++) {
        if (order_items[i] === itemName) {
            return i;
            break;
        } else {
            return false;
        }
    }
}

功能:查找商品是否在订单列表中

function isItemInOrder(itemName) {
    for (var i = 0; i < order_items.length; i++) {
        if (order_items[i] === itemName) {
            return true;
            break;
        } else {
            return false;
        }
    }
}

结论

我不知道如何执行这种CRUD 操作。 SO,y​​outube等我都搜过了,他们的增删改查操作都是跟ajax和文件相关的,不过这个应该没问题。

我想帮助您解决这个编码问题。此代码执行您在后台询问的内容。我没有在此代码中包含任何 html 操作,因为我觉得首先了解算法很重要,然后再添加您的 ui 代码。

    const all_items = ['some item 1', 'some item 2', 'some item 3', 'some item 4', 'some item 5', 'some item 6'];
    const order_items: string[] = [];

    function order(index) {
        // see if the items from all_items[] is in order_items
        // indexOf will return the index if found otherwise -1
        const existing = order_items.indexOf(all_items[index]);
        if (existing >= 0) {
            // item found in order_items
            order_items.slice(existing, 1);         // remove item from order_items
        } else {
            // item not found in order_items
            order_items.push(all_items[index]);     // add item to order_items
        }
    }

如果这对您有帮助,我很乐意扩展它以包含您的 DOM 操作逻辑。

这是我根据您所说的仅使用纯 javascript 快速整理的内容。虽然我必须说这似乎是实施订购系统的糟糕方式...

const all_items = ['some item 1', 'some item 2', 'some item 3', 'some item 4', 'some item 5', 'some item 6'];
var order_items = [];

const itemList = document.getElementById("itemList");
const orderList = document.getElementById("orderList");

function handleClick(item){
  if(order_items.includes(item.innerHTML)){
    //remove item
    order_items = order_items.filter(e => e !== item.innerHTML);
  }else{
    //add item
    order_items.push(item.innerHTML);
  }
  var items = document.getElementsByClassName('orderItem');
  while(items[0]) {
      items[0].parentNode.removeChild(items[0]);
  }
  order_items.forEach(item => {
    var i = document.createElement("li");
    i.setAttribute("class", "orderItem");
    i.innerHTML = item;
    orderList.appendChild(i);
  });
}

all_items.forEach(item => {
  var i = document.createElement("li");
  i.setAttribute("class", "item");
  i.innerHTML = item;
  i.setAttribute("onclick", "handleClick(this)");
  itemList.appendChild(i);
});
body{
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}

.item{
  background-color: crimson;
  color: white;
  padding: 1rem;
  margin-bottom: 5px;
  cursor: pointer;
  border-radius: 5px;
  transition: 0.3s;
}
.item:hover{
  transform:scale(1.1);
}
<div>
<h1>all items</h1>
<ul id="itemList">
</ul>
</div>

<div>
<h1>orderd list</h1>
<ul id="orderList">
</ul>
</div>