代码之家  ›  专栏  ›  技术社区  ›  JackTheKnife

基于键值组合从数组中移除对象

  •  0
  • JackTheKnife  · 技术社区  · 7 年前

    我正在尝试基于键/值组合从数组中删除对象-在我的例子中,删除所有“非活动”用户。

    示例代码如下

        var items = [ 
          { "userID":"694","active": false }, 
          { "userID":"754","active": true }, 
          { "userID":"755","active": true },
          { "userID":"760","active": false },
          { "userID":"761","active": false },
          { "userID":"762","active": false }
          ]
        
            function removeByKey(array, params){
              array.some(function(item, index) {
                return (array[index][params.key] !== params.value) ? !!(array.splice(index, 1)) : false;
              });
              return array;
            }
        
         for (var i = 0; i < items.length; i++){ 
        	
        	var removed = removeByKey(items, {
              key: 'active',
              value: true
            });
        }
        
            console.log(removed);

    但每次数组中的最后一个条目包含 "active": false ,它将不会被删除。

    感谢您的帮助!

    4 回复  |  直到 7 年前
        1
  •  1
  •   Jayffe    7 年前

    可能有这样的功能:

    function removeByKey(array, params){
    
      return array.filter( item => item[params.key] !== params.value)
    }
    
        2
  •  1
  •   Jonas Wilms    7 年前

    因为如果删除一个元素(比如最后一个元素),那么for循环将跳过下一个元素,因为它的索引变小了。如果您想继续使用自定义移除函数,您必须这样调用它:

    let previous;
    do {
        previous = items.length;
        removeByKey(items, {
          key: 'active',
          value: true
        });
     } while(previous !== items.length)
    

    但实际上效率很低,所以您应该修改方法,使其删除所有发生的情况,而不仅仅是第一次发现的情况( forEach 而不是 some 或者只是 filter 它)

        3
  •  0
  •   Wojtek Szafraniec    7 年前

    var filtereditems=items.filter(item=>item.active);

        4
  •  0
  •   JackTheKnife    7 年前

    @jayfee答案的ES5版本:

     function removeByKey(array, params){
    
        return array.filter(function (item) {
          return item[params.key] !== params.value;
        });
    }