【问题标题】:Filtering in JavascriptJavascript 中的过滤
【发布时间】:2019-05-09 21:38:46
【问题描述】:

我有一个包含 10 个项目的列表,我必须从中取出 1 个项目。即如果 myItems 中同时存在“Item1”和“item2”,那么我应该从“myItems”中取出“item2”。 (没有箭头功能)与我下面的方法相比,有没有更简单更好的方法。

 function getFilteredItems(myItems) {
           var items = ['item1', 'item2'];             

           var filteredItems = myItems.filter(function (myItem) {
               return items.indexOf(myItem.name) !== -1;
           });

           if (filteredItems && filteredItems.length > 1) {

               myItems = myItems.filter(function (myItem) {
                   return 'item2' !== myItem.name;
               });
           }

           return myItems;
       }

【问题讨论】:

  • 我的答案是唯一没有箭头功能的;任何人都可以理解。
  • 同意。但我想避免使用包含,因为“Item1”并不总是相同的。这就是我将项目声明为数组而不是 2 个变量的原因。
  • 您避免使用箭头函数的任何具体原因?将箭头函数转换为非箭头函数非常容易。我更新了我的答案。
  • @JacobThomas - 我不能使用 ES6。您的回答从 myItems 中取出 item1 和 item2。只有当 myItems 有 item1 和 item2 时,我才想取出 item2。
  • @San 你是对的,那是我的误解。我更新了我的答案,但老实说,你的功能可以正常工作。我只是喜欢挑战一下自己。

标签: javascript arrays filter ecmascript-5


【解决方案1】:
function removeDups(items) {
  var newItems = [];

  items.forEach(function(item) { 
    if (!newItems.includes(item)) { 
      return newItems.push(item) 
    } 
  });

  return newItems;
}

现在使用您的项目数组调用 removeDups

var items = ['a', 'b', 'c', 'a'];
removeDups(items); // ['a', 'b', 'c']

这假定您的列表没有对象。如果您的列表有对象,请替换 if 中的条件以匹配您的对象。

【讨论】:

    【解决方案2】:

    这就是我会做的。
    我更喜欢这个,因为您可以轻松地将对象添加到 items 并过滤掉它们,或者让它完全动态

    function getFilteredItems(myItems) {
        var items = [{name:'item1'}, {name:'item2'}];
        if( myItems.reduce((c, item) => c += items.map(obj => obj.name).includes(item.name) , 0) == 2 ) { items.shift(); };
        return myItems.filter(item => !items.map(obj => obj.name).includes(item.name) )
    }
    

    如果items 没有满对象

    function getFilteredItems(myItems) {
        var items = ['item1', 'item2'];
        if( myItems.reduce((c, item) => c += items.includes(item.name) , 0) == 2 ) { items.shift(); };
        return myItems.filter(item => !items.includes(item.name) )
    }
    

    编辑:没有箭头功能

    // items is objects
    function getFilteredItems(myItems) {
        var items = [{name:'item1'}, {name:'item2'}];
        if( myItems.reduce(function(c, item) { return c += items.map( function(obj) { return obj.name}).includes(item.name)} , 0) == 2 ) { items.shift(); };
        return myItems.filter( function(item) { return !items.map( function(obj) {return obj.name}).includes(item.name)} )
    }
    
    
    // items is strings
    function getFilteredItems(myItems) {
        var items = ['item1', 'item2'];
        if( myItems.reduce(function(c, item){ return c += items.includes(item.name) } , 0) == 2 ) { items.shift(); };
        return myItems.filter( function(item) { return !items.includes(item.name)} )
    }
    

    【讨论】:

      【解决方案3】:

      myitems.filter(item => !items.includes(item))

      【讨论】:

      • myItems 似乎是一个具有 name 属性的对象数组,'item2' !== myItem.name
      • myitems.filter( item => !items.includes(item.name))
      【解决方案4】:

      这是一个简单的方法:

      if(myItems.includes("item1") && myItems.includes("item2")){
        myItems.splice(myItems.indexOf("item2"),1);
      }
      

      var myItems = ["item1","item2","item3","item4","item5","item6"];
      console.log(myItems);
      function deleteItem(){
        if(myItems.includes(document.getElementById("itemA").value) && myItems.includes(document.getElementById("itemB").value)){
          myItems.splice(myItems.indexOf(document.getElementById("itemB").value),1);
        }
        console.log(myItems);
      }
      <input type="text" id="itemA">If this...<br>
      <input type="text" id="itemB">and this... delete this<br>
      <button onclick="deleteItem();">Delete!</button>

      【讨论】:

      • 我感觉items在现实中不会是标准尺寸
      • @JacobThomas 你是什么意思? splice 中的1 是要删除的数量。
      • 我的数组是对象数组。为了我的帖子,我保持简单。同样在内部执行两次 .includes 会执行两次循环。
      • 我的意思是,myItems.includes("item1") &amp;&amp; myItems.includes("item2") 是硬编码的,每个值一个条件。这并不理想,尤其是在动态的情况下
      • 无论myItems 有多长或"item1""item2" 是什么,此代码都应该有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2010-10-25
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多