2016-12-14 67 views
1

我正在学习如何通过购物清单运动管理应用程序的状态。按照指示,我在那里我存储我添加任何物品的对象内部的数组:如何从阵列是一个对象的内部取出的特定元素?

var state = { 
    items: [] 
}; 

要修改state我用这个函数:

var addItem = function(state, item) { 
state.items.push(item); 
}; 

它通过一个事件监听器后来被称为(并通过renderList添加到DOM,这里没有显示):

$('#js-shopping-list-form').submit(function(event){ 
    event.preventDefault(); 
    addItem(state, $('#shopping-list-entry').val()); 
    renderList(state, $('.shopping-list')); 
}); 

如何从数组中删除我的state对象内的具体项目?基本上我想要扭转,当用户点击<button class="shopping-item-delete">上面的序列。

下面是最终解决方案的演示:https://thinkful-ed.github.io/shopping-list-solution/

HTML

<body> 

    <div class="container"> 

    <form id="js-shopping-list-form"> 
     <label for="shopping-list-entry">Add an item</label> 
     <input type="text" name="shopping-list-entry" id="shopping-list-entry" placeholder="e.g., broccoli"> 
     <button type="submit">Add item</button> 
    </form> 

    <ul class="shopping-list"> 
    <li> 
     <span class="shopping-item">apples</span> 
     <div class="shopping-item-controls"> 
      <button class="shopping-item-toggle"> 
      <span class="button-label">check</span> 
      </button> 
      <button class="shopping-item-delete"> 
      <span class="button-label">delete</span> 
      </button> 
     </div> 
     </li> 
    </ul> 
    </div> 

    <script 
    src="https://code.jquery.com/jquery-3.1.1.min.js" 
    integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" 
    crossorigin="anonymous"></script> 
<script type="text/javascript" src="app.js"></script> 
</body> 

回答

2

您可以创建一个功能如下:

var deleteItem = function(state, item) { 
    var index = state.items.indexOf(item); 
    if (index > -1) { 
     state.items.splice(index, 1); 
    } 
}; 

注意,方法indexOf在Internet Explorer 7和8不支持

+0

当然,我们可以放手IE 7和8吧?这几乎是2017年!哈哈,反正填充工具都可以在这里https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Polyfill –

+0

@Andy发现,这个伟大的工程!谢谢。 –

0

有几种方法可以从阵列中移除元素:

shift将从头开始删除第一项

pop将从最后删除最后一项。

splice可以让你在需要的位置删除元素

注意,所有这些将修改原始数组(他们的工作“就地”),而不是返回一个新的数组。

0

您可以循环在项目

var removeItem = function(state, item) { 
    for(var i = state.items.length - 1; i >= 0; i--) { 
    if(state.items[i] === item) { 
     state.items.splice(i, 1); 
     break; 
    } 
    } 
}; 
相关问题