【问题标题】:filter an array on object keys not empty过滤对象键上的数组不为空
【发布时间】:2017-09-27 12:26:31
【问题描述】:

我正在尝试通过值不为空的对象键过滤对象数组

var collection = [
                      {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "MEN",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "NONE",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
                     ]

      var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}

      var result = _.filter(collection , proPack => {
                          if (filterList.group !== '') {
                              return proPack.group === filterList.group;
                          } else {
                              return proPack;
                          }
                    });
                    
                    console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

这对我来说适用于一个过滤器,但我无法找到一种方法来过滤所有其他有值的键。

结果应该是:

result = [
              {
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
} ]

【问题讨论】:

  • 我不是 100% 清楚问题是什么
  • @PaulFitzgerald 我添加了 sn-p,结果应该过滤所有键,而不仅仅是一个键。我找不到过滤所有的方法

标签: javascript ecmascript-6 lodash


【解决方案1】:

您可以删除空属性:

var collection = [{
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  },
  {
    "season": "ETE 18",
    "group": "MEN",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  },
  {
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "NONE",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  }
]

var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}
          
var filterList = _.omitBy(filterList, _.isEmpty)   // { group: "GRBABY", market: "ALL" }

var result = _.filter(collection, filterList)

console.log(filterList, result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

  • 您可以使用 omitBy 编写删除空过滤器的代码:let filters = _.omitBy(filterList, _.isEmpty);
  • @Slai 如果 filterList 对象只有两个键,这确实有效,但我的 filterList 是一个始终具有所有键的对象模型,有些是 valorised 而有些则不是。这就是为什么我只需要过滤具有值的键
  • 谢谢@GruffBunny
【解决方案2】:

我认为这应该可以满足您的需求。您忽略了 filterList 中具有空值的键,对吗?

var collection = [
                      {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "MEN",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "NONE",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
                     ]

      var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}

var doFilter = function(arr, filterObj) {
    return arr.filter(propack => {
        for (key in filterObj) {
            if (filterObj[key] && filterObj[key] !== propack[key]) {
                return false;
            }
        }
        return true;
    });
};

console.log(doFilter(collection, filterList));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2018-10-20
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多